深度学习和神经网络
一、基本神经网络架构
ANN,MLP,全连接网络,前馈网络
weight0_1=4*5+5(每个神经元一个偏置)=25
weight1_2,weights2_outputs以此类推,一共73条权重
model=sequential([Dense(5,input_dim=4),Dense(5),Dense(3)])
二、激活函数
详细介绍参考:深度学习中常见的10种激活函数(Activation Function)总结_激活函数有哪些-CSDN博客
简单介绍一下激活函数:
激活函数 | 描述 | 方程 |
---|---|---|
线性转移函数(恒等函数) | 信号无变化地穿过函数并保持线性几乎,没有被使用过 | f(x)=x |
阶跃函数(二元分类器) | 产生二元输出(0或1),输出离散 | |
Sigmod/logistic | 将所有值压缩到0-1之间的一个概率,用于二分类 | |
tanh | 将所有值压缩到-1-1之间,在隐藏层中的表现比sigmod表现好 | |
ReLU | 仅在输入大于0时激活节点,隐藏层的首选激活函数,比tanh表现好 | f(x)=max(0,x) |
Leaky ReLU | ReLU在x<0时函数值为0,而Leaky ReLU引入一个极小的负斜率(0.01左右) | f(x)=max(0.01x,x) |
对于隐藏层:首选ReLU或者 Leaky ReLU ,因为其计算速度更快且降低了梯度(斜率)消失的可能,因为它在输入极大值时不会饱和
三、损失函数
1、均方误差
常用于输出实数的回归问题(房价预测)中,对异常值非常敏感,公式如下:
E
(
W
,
b
)
=
1
/
N
∗
∑
i
=
1
N
(
y
i
ˉ
−
y
i
)
2
>
0
E(W,b)=1/N*\sum_{i=1}^{N}{(\bar{y_i}-y_i)^2}>0
E(W,b)=1/N∗i=1∑N(yiˉ−yi)2>0
2、平均绝对误差
当你并不想被异常值扭曲时,可以考虑平均绝对误差。
E
(
W
,
b
)
=
1
/
N
∗
∑
i
=
1
N
∣
y
i
ˉ
−
y
i
∣
>
0
E(W,b)=1/N*\sum_{i=1}^{N}{|\bar{y_i}-y_i|}>0
E(W,b)=1/N∗i=1∑N∣yiˉ−yi∣>0
3、交叉熵损失函数
用于分类问题,代表预测分布和真实分布之间额距离,公式如下
E
(
W
,
b
)
=
−
∑
i
=
1
n
∑
j
=
1
m
y
i
j
ˉ
l
o
g
(
p
i
j
)
E(W,b)=-\sum_{i=1}^{n}{\sum_{j=1}^{m}\bar{y_{ij}}log(p_{ij})}
E(W,b)=−i=1∑nj=1∑myijˉlog(pij)
y为目标概率,p为预测概率,m为类别数量,n为样本数量,W为权重值矩阵,b为偏执向量
四、优化算法
1、梯度下降
方向(梯度,斜率):为了最快从山顶到山脚,要走最陡的坡(最快的下降方向)
步长α(学习率):下山时每一步跨越的长度,作为超参数从0.01开始下降到0.001,0.0001…
将方向与步长相乘得到每一步权重的变化:
Δ
w
i
=
−
α
∗
d
E
d
w
i
\Delta{w_i}=-\alpha*\frac{dE}{dw_i}
Δwi=−α∗dwidE
w 下一步 = w 当前 + Δ w w_{下一步}=w_{当前}+\Delta{w} w下一步=w当前+Δw
2、梯度下降算法对比
BGD(批梯度下降算法) | SGD(随机梯度下降算法) | MB-GD(小批梯度下降) |
---|---|---|
选择所有数据计算梯度,更新权重并下降一步,重复n次迭代。 | 对训练样本随机洗牌,选择一个数据实例计算梯度,更新权重并下降一步,选择另一个实例重复n次迭代。 | 训练样本分成小批次(batch_size(超参数)=32,64,128,256),计算的性能优于SGD,比BGD更少迭代。 |
误差曲线是一条平滑的下降曲线 | 误差曲线是一条震荡的下降曲线 |
优化器代码查找这个网址:Optimizers (keras.io)
示例:
# training
batch_size = 64
epochs=125
from keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(filepath='model.125epochs.hdf5', verbose=1, save_best_only=True)
# you can try any of these optimizers by uncommenting the line
# optimizer = keras.optimizers.rmsprop(lr=0.001,decay=1e-6)
# optimizer = keras.optimizers.adam(lr=0.0005,decay=1e-6)
optimizer = keras.optimizers.rmsprop(lr=0.0003,decay=1e-6)
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
history = model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size), callbacks=[checkpointer],
steps_per_epoch=x_train.shape[0] // batch_size, epochs=epochs,verbose=2,
validation_data=(x_test,y_test))
五、向后传播
复习一下前三个神经网络的典型步骤:
1、前馈:得到加权和线性组合并应用激活函数得到预测值
2、计算损失函数或者误差
3、使用一种梯度下降优化算法计算\Delta{w_i},优化误差函数
Δ
w
i
=
−
α
∗
d
E
d
w
i
\Delta{w_i}=-\alpha*\frac{dE}{dw_i}
Δwi=−α∗dwidE
4、在网络中**向后传播**\Delta{w_i}来更新权重:
W
新
=
W
旧
−
α
∗
(
d
E
r
r
o
r
d
w
x
)
W_{新}=W_{旧}-\alpha*(\frac{dError}{dw_x})
W新=W旧−α∗(dwxdError)
反向传播将误差对于每一个特定权重的倒数从最后一层传回第一层以调整权重。
d E d w 1 , 3 ( 1 ) = d E d w 2 , 1 ( 4 ) ∗ d w 2 , 1 ( 4 ) d w 2 , 2 ( 3 ) ∗ d w 2 , 2 ( 3 ) d w 3 , 2 ( 2 ) ∗ d w 3 , 2 ( 2 ) d w 1 , 3 ( 1 ) \frac{dE}{dw_{1,3}^{(1)}}=\frac{dE}{dw_{2,1}^{(4)}}*\frac{dw_{2,1}^{(4)}}{dw_{2,2}^{(3)}}*\frac{dw_{2,2}^{(3)}}{dw_{3,2}^{(2)}}*\frac{dw_{3,2}^{(2)}}{dw_{1,3}^{(1)}} dw1,3(1)dE=dw2,1(4)dE∗dw2,2(3)dw2,1(4)∗dw3,2(2)dw2,2(3)∗dw1,3(1)dw3,2(2)
本篇内容参考深度学习计算机视觉第二章,大部分内容搬运。