文章目录
一、Machine Learning Introduce
1.1 Loss Function
以下式子中 x i x_i xi 表示第 i i i 个训练资料通过神经网络后的输出(估计值), y i y_i yi 表示第 i i i 个训练资料的标签(真实值)。
1.1.1 基于距离度量的损失函数
(1)均方误差损失函数 MSE
M
E
S
L
o
s
s
=
1
n
∑
i
=
1
n
(
x
i
−
y
i
)
2
,
n
=
B
a
t
c
h
S
i
z
e
\large MESLoss = \frac {1} {n} \sum_{i=1}^{n}{(x_i-y_i)^2}\ ,\ n=BatchSize
MESLoss=n1i=1∑n(xi−yi)2 , n=BatchSize
(2)L1 损失函数( MAE )
L
1
L
o
s
s
=
1
n
∑
i
=
1
n
∣
x
i
−
y
i
∣
\large L1Loss=\frac {1} {n} \sum_{i=1}^{n}{|x_i-y_i|}
L1Loss=n1i=1∑n∣xi−yi∣
1.1.2 基于概率分布的损失函数
(1)交叉熵 CrossEntropyLoss
交叉熵可依次利用 softmax() 、log() 和 NLLLoss() 得到。在下式中设
x
i
x_i
xi 是第
i
i
i 图片经过
C
N
N
CNN
CNN 得到的
n
n
n 维向量,
x
i
j
x_{ij}
xij 表示没有进行归一化的概率;
C
l
a
s
s
i
Class_i
Classi 表示第
i
i
i 张图片属于的真实类别(如:0 表示猫、1 表示狗等)。
对
x
i
向量进行归一化:
x
i
,
j
=
e
x
i
,
j
s
u
m
,
s
u
m
=
∑
j
=
1
n
e
x
i
,
j
对归一化后的
x
i
向量取对数:
x
i
,
j
=
l
o
g
(
x
i
,
j
)
最后对
x
i
向量用于
N
L
L
o
s
s
:
r
e
s
u
l
t
=
−
x
i
[
C
l
a
s
s
i
]
C
r
o
s
s
E
n
t
r
o
p
y
L
o
s
s
=
−
∑
i
=
1
b
a
c
t
c
h
s
i
z
e
l
o
g
(
e
x
i
,
c
l
a
s
s
i
∑
j
=
1
n
e
x
i
,
j
)
\begin{align} &\Large 对\ x_i \ 向量进行归一化:x_{i,j}=\frac {e^{x_{i,j}}} {sum}\ , \ sum=\sum_{j=1}^{n}e^{x_{i,j}} \\ &\Large 对归一化后的\ x_i \ 向量取对数: x_{i,j}=log(x_{i,j}) \\ \\ &\Large 最后对x_i向量用于NLLoss:result=-x_i[Class_i] \\ \\ &\Large CrossEntropyLoss=-\sum_{i=1}^{bactchsize}log(\frac {e^{x_{i,class_i}}} {\sum_{j=1}^{n} e^{x_{i,j}}}) \end{align}
对 xi 向量进行归一化:xi,j=sumexi,j , sum=j=1∑nexi,j对归一化后的 xi 向量取对数:xi,j=log(xi,j)最后对xi向量用于NLLoss:result=−xi[Classi]CrossEntropyLoss=−i=1∑bactchsizelog(∑j=1nexi,jexi,classi)
import torch
input=torch.randn(2,2)
print(input) # tensor([[-1.6243, -0.4164],
# [-0.2492, -0.9667]])
# 归一化
soft = torch.nn.Softmax(dim=1)
soft(input) # tensor([[0.2301, 0.7699],
# [0.6721, 0.3279]])
# 取对数
torch.log(soft(input)) # tensor([[-1.4694, -0.2615],
# [-0.3974, -1.1149]])
# 运用NLLLoss函数
nll = nn.NLLLoss()
target = torch.tensor([0,1])
nll(torch.log(soft(input)),target)# tensor(1.2921)
# 直接使用CrossEntropyLoss
ce = nn.CrossEntropyLoss()
ce(input,target) # tensor(1.2921)
1.2 Optimization
- θ t \theta_{t} θt : model parameters at time step t t t
- ∇𝐿( θ t \theta_{t} θt) or g t g_t gt : gradient at θ t \theta_{t} θt , used to compute θ t + 1 \theta_{t+1} θt+1
- m t + 1 m_{t+1} mt+1: momentum accumulated from time step 0 to time step 𝑡, which is used to compute θ t + 1 \theta_{t+1} θt+1
(1)SGDM
SGDM 在 SGD 增添了动量特性,之前所求的 Gradient 会影响当前,影响的强度有 λ \lambda λ 的大小决定, λ \lambda λ 越大影响也越大。
(2)Adagrad
作用:动态调整Learning Rate的大小,使用自适应的学习率就可以帮助算法在梯度大的参数方向减缓学习速率,而在梯度小的参数方向加快学习速率,这就可以促使神经网络的训练速度的加快。Adagrad 的核心想法就是,如果一个参数的梯度一直都非常大,那么其对应的学习率就变小一点,防止震荡,而一个参数的梯度一直都非常小,那么这个参数的学习率就变大一点,使得其能够更快地更新,这就是Adagrad算法加快深层神经网络的训练速度的核心。
(3)RMSProp
(4)Adam
Adam 结合了 SGDM 和 RMSProp,使其同时具有动量特性和自适应的学习速率。
1.3 BackPropagation
作用
在运用 Gradient Descent 方法更新神经网络中的 weight 时,可以利用BP算法快速计算 $\nabla L(θ) $。
- C n ( θ ) C^n(θ) Cn(θ) :第 n 个训练资料的训练值与真实值的误差值;
-
N
N
N :等于 batchsize ;
算法过程
定义如下图所示 Neural Network ,其使用的激活函数
f
(
x
)
=
s
i
g
m
o
i
d
(
x
)
f(x)=sigmoid(x)
f(x)=sigmoid(x) ,输入为
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2) ,输出为
(
y
1
,
y
2
)
(y_1,y_2)
(y1,y2) ,训练资料标签为
(
t
a
r
g
e
t
1
,
t
a
r
g
e
t
2
)
(target_1,target_2)
(target1,target2) ,使用的损失函数为均方差 MSE 。
已知条件如下:
y
1
=
f
(
z
3
)
=
s
i
g
m
o
i
d
(
z
3
)
,
y
2
=
f
(
z
4
)
=
s
i
g
m
o
i
d
(
z
4
)
f
(
x
)
′
=
f
(
x
)
⋅
[
1
−
f
(
x
)
]
C
=
(
f
(
z
3
)
−
t
a
r
g
e
t
1
)
2
+
(
f
(
z
4
)
−
t
a
r
g
e
t
2
)
2
\large y_1=f(z_3)=sigmoid(z_3)\ ,\ y_2=f(z_4)=sigmoid(z_4) \\ \large f(x)^{'}=f(x)·[1-f(x)] \\ \large C=(f(z_3)-target_1)^2+(f(z_4)-target_2)^2
y1=f(z3)=sigmoid(z3) , y2=f(z4)=sigmoid(z4)f(x)′=f(x)⋅[1−f(x)]C=(f(z3)−target1)2+(f(z4)−target2)2
利用链式求导法则,求各个
w
w
w 对
C
C
C 的偏导:
∂ C ∂ w 5 = ∂ C ∂ z 3 ∂ z 3 ∂ w 5 = 2 f ( z 3 ) ′ ( f ( z 3 ) − t a r g e t 1 ) ⋅ f ( z 1 ) ∂ C ∂ w 1 = ∂ z 1 ∂ w 1 ∂ C ∂ z 1 = ∂ z 1 ∂ w 1 ∂ f ( z 1 ) ∂ z 1 ∂ C ∂ f ( z 1 ) = ∂ z 1 ∂ w 1 ∂ f ( z 1 ) ∂ z 1 [ ∂ z 3 ∂ f ( z 1 ) ∂ C ∂ z 3 + ∂ z 4 ∂ f ( z 1 ) ∂ C ∂ z 4 ] ∂ C ∂ w 1 = x 1 ⋅ f ( z 1 ) ′ ⋅ [ w 5 ∂ C ∂ z 3 + w 7 ∂ C ∂ z 4 ] \large \frac {\partial C } {\partial w_5 }=\frac {\partial C} {\partial z_3}\frac {\partial z_3} {\partial w_5}=2f(z_3)^{'}(f(z_3)-target_1)·f(z_1) \\ \large \frac {\partial C} {\partial w_1}=\frac {\partial z_1} {\partial w_1} \frac {\partial C} {\partial z_1}=\frac {\partial z_1} {\partial w_1} \frac {\partial f(z_1)} {\partial z_1} \frac {\partial C} {\partial f(z_1)}=\frac {\partial z_1} {\partial w_1} \frac {\partial f(z_1)} {\partial z_1} [\frac {\partial z_3} {\partial f(z_1)} \frac {\partial C} {\partial z_3} +\frac {\partial z_4} {\partial f(z_1)} \frac {\partial C} {\partial z_4}] \\ \large \frac {\partial C} {\partial w_1}=x_1·f(z_1)^{'}·[w_5\frac {\partial C} {\partial z_3}+w_7\frac {\partial C} {\partial z_4}] ∂w5∂C=∂z3∂C∂w5∂z3=2f(z3)′(f(z3)−target1)⋅f(z1)∂w1∂C=∂w1∂z1∂z1∂C=∂w1∂z1∂z1∂f(z1)∂f(z1)∂C=∂w1∂z1∂z1∂f(z1)[∂f(z1)∂z3∂z3∂C+∂f(z1)∂z4∂z4∂C]∂w1∂C=x1⋅f(z1)′⋅[w5∂z3∂C+w7∂z4∂C]
从上式可以看出:
∂
C
∂
w
i
=
∂
z
j
∂
w
i
∂
C
∂
z
j
前一个神经元的输出
=
∂
C
∂
w
i
,
∂
C
∂
z
j
可以根据下图快速求出。
\large \frac {\partial C } {\partial w_i }=\large \frac {\partial z_j } {\partial w_i } \frac {\partial C } {\partial z_j } \\ \large 前一个神经元的输出=\frac{\partial C} {\partial w_i}\ ,\ \frac {\partial C } {\partial z_j }可以根据下图快速求出。
∂wi∂C=∂wi∂zj∂zj∂C前一个神经元的输出=∂wi∂C , ∂zj∂C可以根据下图快速求出。
二、卷积神经网络 CNN
Ⅰ 附录
Piecewise Linear Curves [kɜːvz] 分段线性曲线
Rectified Linear Unit [ˈrektɪfaɪd] 整流线性单元
approximant [əˈprɒksɪmənt] 近似值,逼近式
parameters [pəˈræmɪtəz] 参数,决定因素
gradient [ˈɡreɪdiənt] 梯度,坡度
Activation function 激活函数
backpropagation [prɒpə’ɡeɪʃ(ə)n] 反向传播