深度学习基础
激活函数
-
sigmoid
- σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+e−x1
- 容易出现梯度消失的现象;当激活函数接近饱和区时,变化太缓慢,导数接近0
- Sigmoid 的 output 不是0均值; f=sigmoid(wx+b)为例, 假设输入均为正数(或负数),那么对w的导数总是正数(或负数),这样在反向传播过程中要么都往正方向更新,要么都往负方向更新
- 幂运算相对耗时
-
tanh
- t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^{x} + e^{-x}} tanh(x)=ex+e−xex−e−x
- tanh函数将输入值压缩到 -1~1 的范围,因此它是0均值的,解决了Sigmoid函数的非zero-centered问题,但是它也存在梯度消失和幂运算的问题
-
relu
- Relu(x) = max(0,x)
- 优点:
- SGD算法的收敛速度比 sigmoid 和 tanh(梯度不会饱和,解决了梯度消失问题)
- 计算复杂度低,不需要进行指数运算;
- 缺点:
- ReLU的输出不是zero-centered
- Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数永远不会被更新(在负数部分,梯度为0)
- ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张
parameters initialization
- initialize weights ~Uniform(-r,r), r =
6 / ( f a n i n + f a n o u t ) \sqrt{6/(fan_{in} + fan_{out})} 6/(fanin+fanout)
其中 f a n i n fan_{in} fanin是前一层的维度, f a n o u t fan_{out} fanout是后一层的维度
CNN
- 稀疏链接
- 参数共享
- 平移不变性
RNN
- forward propagation
S
t
=
σ
(
W
s
S
t
−
1
+
W
x
x
t
+
b
1
)
S_t = \sigma(W_{s}S_{t-1} + W_{x}x_t+b_1)
St=σ(WsSt−1+Wxxt+b1)
y
^
t
=
s
o
f
t
m
a
x
(
W
o
s
t
+
b
2
)
\hat y_t = softmax(W_os_t+b_2)
y^t=softmax(Wost+b2)
- loss
- The loss at time-step
t
t
t
J t ( θ ) = − ∑ j = 1 ∣ V ∣ y t , j l o g ( y ^ t , j ) J^t(\theta) = -\sum_{j=1}^{|V|}y_{t,j}log(\hat y_{t,j}) Jt(θ)=−∑j=1∣V∣yt,jlog(y^t,j) - total loss
J = − 1 T ∑ t = 1 T J ( t ) ( θ ) = − 1 T ∑ t = 1 T ∑ j = 1 ∣ V ∣ y t , j l o g ( y ^ t , j ) J = -\frac {1}{T}\sum_{t=1}^TJ^{(t)}(\theta) = -\frac {1}{T}\sum_{t=1}^T\sum_{j=1}^{|V|}y_{t,j}log(\hat y_{t,j}) J=−T1∑t=1TJ(t)(θ)=−T1∑t=1T∑j=1∣V∣yt,jlog(y^t,j)
- The loss at time-step
t
t
t
- RNN梯度消失的原因
假设时间序列只有三段, S 0 S_0 S0为给定值,神经元没有激活函数,RNN的前向传播过程如下:
S 1 = W x X 1 + W s S 0 + b 1 S_1 = W_xX_1 + W_sS_0 + b_1 S1=WxX1+WsS0+b1
y 1 ^ = W o S 1 + b 2 \hat{y_1} = W_oS_1 + b_2 y1^=WoS1+b2
S 2 = W x X 2 + W s S 1 + b 1 S_2 = W_xX_2 + W_sS1 + b1 S2=WxX2+WsS1+b1
y 2 ^ = W o S 2 + b 2 \hat{y_2} = W_oS_2 + b_2 y2^=WoS2+b2
S 3 = W x X 3 + W s S 2 + b 1 S_3 = W_xX_3 + W_sS2 + b_1 S3=WxX3+WsS2+b1
y 3 ^ = W o S 3 + b 2 \hat{y_3} = W_oS_3 + b_2 y3^=WoS3+b2
假设在 t = 3 t=3 t=3时刻,损失函数为平方损失函数
L 3 = 1 2 ( y 3 − y 3 ^ ) 2 L_3 = \frac{1}{2}(y_3 - \hat{y_3})^2 L3=21(y3−y3^)2
L t = 1 2 ( y t − y t ^ ) 2 L_t = \frac{1}{2}(y_t - \hat{y_t})^2 Lt=21(yt−yt^)2
则一次训练任务的损失函数为每一时刻损失值得累加
L = ∑ t = 0 T L t L = \sum_{t=0}^TL_t L=∑t=0TLt
使用随机梯度下降法训练RNN就是不断地对 W x W_x Wx, W s W_s Ws, W o W_o Wo求偏导数,不断的调整这些参数使 L L L最小
现在对 t 3 t_3 t3时刻的 W x W_x Wx, W s W_s Ws, W o W_o Wo求偏导数
但是对于 W x W_{x} Wx、 W s W_{s} Ws 求偏导,会随着时间序列产生长期依赖。因为 S t S_{t} St 随着时间序列向前传播,而 S t S_{t} St 又是 W x W_{x} Wx、 W s W_{s} Ws的函数
如果加上激活函数
S j = t a n j ( W x X j + W s S j − 1 + b 1 ) S_j=tanj(W_xX_j + W_sS_{j-1} + b_1) Sj=tanj(WxXj+WsSj−1+b1)
∏ j = k + 1 t ∂ S j ∂ S j − 1 = ∏ j = k + 1 t t a n h ′ W s \prod_{j=k+1}^t\frac{\partial{S_j}}{\partial{S_{j-1}}} = \prod_{j=k+1}^ttanh^{'}W_s ∏j=k+1t∂Sj−1∂Sj=∏j=k+1ttanh′Ws
而tanh的导数是一个小于1的数,所以容易出现梯度消失的现象。
需要注意的是,梯度消失是随着层数增加逐渐消失的。就拿上面提到的对 t 3 t_3 t3时刻的 W x W_x Wx求偏导,其实是 t 3 t_3 t3, t 2 t_2 t2, t 1 t_1 t1时刻 L 3 L_3 L3对 W x W_x Wx求偏导的累加,如果要求 L 3 L_3 L3对 t 1 t_1 t1时刻 W x W_x Wx的梯度就要消失了。 - Solution to the Exploding & Vanishing Gradients
- clips gradients to a small number whenever they explode
- use the Rectified Linear Units (ReLU) instead of the sigmoid function(solve vanishing gradients)
LSTM解决梯度消失
LSTM有三个gate,分别是forget gate, input gate, output gate,通过下面
f
t
f_{t}
ft,
i
t
i_{t}
it,
o
t
o_{t}
ot 三个函数来控制,因为
σ
(
x
)
\sigma(x)
σ(x) 的值是介于0到1之间的,刚好用趋近于0时表示流入不能通过gate,趋近于1时表示流入可以通过gate。
g
t
表
示
输
入
g_t表示输入
gt表示输入
f
t
=
σ
(
W
f
x
X
t
+
W
f
h
h
t
−
1
+
b
f
)
f_t = \sigma(W_{fx}X_t+W_{fh}h_{t-1} + b_f)
ft=σ(WfxXt+Wfhht−1+bf)
i
t
=
σ
(
W
i
x
X
t
+
W
i
h
h
t
−
1
+
b
i
)
i_t = \sigma(W_{ix}X_t+W_{ih}h_{t-1} + b_i)
it=σ(WixXt+Wihht−1+bi)
o
t
=
σ
(
W
o
x
X
t
+
W
o
h
h
t
−
1
+
b
o
)
o_t = \sigma(W_{ox}X_t +W_{oh}h_{t-1}+ b_o)
ot=σ(WoxXt+Wohht−1+bo)
g
t
=
σ
(
W
g
x
X
t
+
W
g
h
h
t
−
1
+
b
g
)
g_t = \sigma(W_{gx}X_t +W_{gh}h_{t-1}+ b_g)
gt=σ(WgxXt+Wghht−1+bg)
状态转移与RNN类似
S
t
=
f
t
S
t
−
1
+
i
t
∗
.
.
.
S_t = f_tS_{t-1} + i_t*...
St=ftSt−1+it∗...
类似于RNN,计算LSTM的
∂
S
t
S
t
−
1
\frac{\partial{S_t}}{S_{t-1}}
St−1∂St
∂
S
t
S
t
−
1
=
f
t
+
.
.
.
\frac{\partial{S_t}}{S_{t-1}} = f_t + ...
St−1∂St=ft+...
公式里其余的项不重要,这里就用省略号代替了**。可以看出当
f
t
=
1
f_t= 1
ft=1时,就算其余项很小,梯度仍然可以很好地传导到上一个时刻**,此时即使层数较深也不会发生 Gradient Vanish 的问题;当
f
t
=
0
f_t = 0
ft=0时,即上一时刻的信号不影响到当前时刻,则此项也会为0;
f
t
f_t
ft在这里控制着梯度传导到上一时刻的衰减程度,与它 Forget Gate 的功能一致。
- Solution to the Exploding & Vanishing Gradients
- clips gradients to a small number whenever they explode
- use the Rectified Linear Units (ReLU) instead of the sigmoid function(solve vanishing gradients)
FTRL optimization
word2vec
word2vec主要有两种训练方式: CBOW(continue bag of words) 和 skip-gram
- Cbow
L = ∑ w ∈ C l o g ( p ( w ∣ C o n t e x t ( w ) ) L = \sum_{w \in C}log(p(w|Context(w)) L=∑w∈Clog(p(w∣Context(w)) - skipgram
L = ∑ w ∈ C l o g ( p ( c o n t e x t ( w ) ∣ w ) ) L = \sum_{w \in C}log(p(context(w)|w)) L=∑w∈Clog(p(context(w)∣w)) - 模型加速方法
- Negative sampling
- 带权负采样。对于高频次,采样概率比较大;对于低频词,采样概率比较低
- Huffman tree
- 输出的是一个Huffman树形结构,每一次分支都可以视为进行了一次二分类
- Negative sampling