神经网络学习
首先数据经过前向传播(经过隐藏层和输出层)得到一个预测结果,然后预测结果和数据标签做损失,然后损失通过反向传播算法来更新模型的参数,直至收敛。
神经网络

一、神经网络的核心思想和原理
1、神经网络结构


2、神经网络的训练过程
首先数据经过前向传播(经过隐藏层和输出层)得到一个预测结果,然后预测结果和数据标签做损失,然后损失通过反向传播算法来更新模型的参数,直至收敛。

二、激活函数

非线性是神经网络的精髓,激活函数就是将数据进行非线性变换,提取数据的非线性特征
1、为什么需要激活函数
激活函数的主要作用是为模型引入非线性变换,引入了非线性变换后的模型能够学习到更为复杂的数据分布,增加模型的数据表达能力。
2、常见的激活函数
(1)、Sigmoid函数:

sigmoid函数的梯度以x=0为中心,梯度随着x增大或者减小而越来越小,有梯度消失的风险,尤其对于深层神经网络的前面层的参数而言,梯度传到这里的时候可能已经很小很小了,导致前面层的神经元参数更新过慢。
sigmoid函数以0.5为中心,为什么以0.5为中心会降低梯度更新的效率?
(2)、tanh函数:

(3)、ReLu函数:

ReLu函数存在各种变体:

(4)、softmax函数

多标签分类和多分类问题的区别?
多标签分类是指一个物体可能属于多个类别(标签),多标签之间的独立的,不是相斥的,比如一张图片的多标签分类,模型可以同时预测该图像为“猫”、“草地”、“户外”等标签;
而多分类问题是指这个物体只能属于一个分类,各个分类之间是相斥的,不是你死就是我活,比如手写数值识别中,模型只能预测这个数字为0-9之间的一个数字,不能又是1又是2的。
3、如何选择激活函数
第一:不要把不同的激活函数应用于同一层,比如不要第一层神经网络使用了sigmoid函数,然后又使用relu函数,但是可以不同层可以使用不同的激活函数,比如第一层神经网络使用sigmoid函数,第二层使用relu函数;
第二:如果使用relu函数,要注意学习率的设置
第三:尽量不要用sigmoid函数,可以试一下tanh.
三、正向传播和反向传播


四、神经网络简单代码实现
1、自己实现一个神经元以及隐藏层和输出层的参数更新,省去了激活函数
import numpy as np
import matplotlib.pyplot as plt
w, b = 1.8, 2.5
np.random.seed(0)
x = np.random.rand(100) * 4 - 2
noise = np.random.randn(100) / 3
y = w * x + b + noise
# 随机初始化参数
y = y.reshape(-1,1)
w1,w2,b1,b2 = np.random.randn(4)
y1 = w1*x+b1
y2 = w2*y1+b1
Loss = (y2-y)**2/2
print(Loss)
w1,w2,b1,b2
# 利用梯度下降算法,优化n轮
n = 100
lr = 0.01
for i in range(n): # 批量梯度下降
y1 = w1*x+b1
y2 = w2*y1+b2
# 计算损失和参数梯度
Loss = ((y2-y)**2)/2
# print(Loss)
dy2 = y2-y
dy1 = w2*dy2
dw1 = x*dy1
dw2 = y1*dy2
db1 = dy1
db2 = dy2
# 参数更新
w1 = w1-lr*np.mean(dw1)
w2 = w2-lr*np.mean(dw2)
b1 = b1-lr*np.mean(db1)
b2 = b2-lr*np.mean(db2)
print(w1,w2,b1,b2)
2、利用sklearn中神经网络
from sklearn.neural_network import MLPRegressor
mlp_reg = MLPRegressor(
hidden_layer_sizes=1,
activation='identity',
learning_rate_init=0.01,
random_state=233
)
mlp_reg.fit(x,y)
mlp_reg.score(x,y)
五、梯度消失和梯度爆炸

1、梯度消失,会导致网络退化

在这个图中可以看出,这里的梯度消失主要是因为sigmoid激活函数的导数特点,导致前面的神经元参数的梯度越来越小,导致这些神经元参数更新很慢,我们称之为梯度消失;
2、梯度爆炸,会导致网络训练不稳定,难以拟合

梯度爆炸主要是由于中间层的参数值连乘导致前面层的参数的梯度越来越大,这样梯度更新的步幅太大,难以找收敛,称之为“爆炸”
3、梯度消失和梯度爆炸产生的原因
第一:神经网络的串联式结构;
第二:反向传播算法;
第三:激活函数;
第四:权重的初始值
4、解决方案
第一:选择合适的激活函数;
第二:进行梯度剪切,主要针对梯度爆炸,也就是设置梯度阈值,如果梯度超过这个阈值,则将其强制限制在这个阈值之下;
第三:改进网络结构,比如残差网络;
六、模型选择
1、模型选择
分为不同种类机器学习模型的选择,比如KNN模型,线性模型;
或者不同超参数的同类模型,比如KNN模型的最近邻居数;
2、模型选择的原则(奥卡姆剃刀原则)
模型的效果;
运算速度;
算力要求;
可解释性;
3、代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.tree import DecisionTreeClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score
def select_model(X,y,cv):
# 使用逻辑回归、KNN、决策树和神经网络进行分类
knn = KNeighborsClassifier(n_neighbors=5)
lgreg = Pipeline([
('poly',PolynomialFeatures(degree=2)),
('model',LogisticRegression())
])
dtree = DecisionTreeClassifier()
mlp = MLPClassifier(
hidden_layer_sizes=(10,20,10),
activation='identity',
learning_rate_init=0.001,
random_state=233
) # 神经网络包括隐藏层、激活函数的设置、学习率和随机初始化权重,设置好这些最基础的就能够进行训练
print('knn_score:%f,lgreg_score:%f,dtree_score:%f,mlp_score:%f'%
(
np.mean(cross_val_score(knn,X,y,cv=5)),
np.mean(cross_val_score(lgreg,X,y,cv=5)),
np.mean(cross_val_score(dtree,X,y,cv=5)),
np.mean(cross_val_score(mlp,X,y,cv=5))
)
)
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
iris = load_iris()
X = iris.data
X = scale.fit_transform(X)
y = iris.target
select_model(X,y,5)

神经网络可视化网站:
tensorflow playground:http://playground.tensorflow.org/
七、神经网络的优缺点和适用条件
1、优点
范围广:问题、数据类型;
效果好:泛化能力强、容错能力高;
性能好:并行计算、GPU或者TPU计算,但是sklearn不支持使用GPU
2、缺点
训练难度大;
训练时间长;
黑盒模型,不可解释性
3、适用条件
数据规模大,人工提取特征困难;
无需解释,只要结果的问题
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)