批量歸一化(BatchNormalization)
對輸入的標準化(淺層模型)
處理后的任意一個特征在數(shù)據(jù)集中所有樣本上的均值為0堤撵、標準差為1仁讨。
標準化處理輸入數(shù)據(jù)使各個特征的分布相近
批量歸一化(深度模型)
利用小批量上的均值和標準差,不斷調(diào)整神經(jīng)網(wǎng)絡(luò)中間輸出粒督,從而使整個神經(jīng)網(wǎng)絡(luò)在各層的中間輸出的數(shù)值更穩(wěn)定陪竿。
1.對全連接層做批量歸一化
位置:全連接層中的仿射變換和激活函數(shù)之間。
2.對卷積層做批量歸?化
位置:卷積計算之后屠橄、應(yīng)?激活函數(shù)之前族跛。
如果卷積計算輸出多個通道,我們需要對這些通道的輸出分別做批量歸一化锐墙,且每個通道都擁有獨立的拉伸和偏移參數(shù)礁哄。 計算:對單通道,batchsize=m,卷積計算輸出=pxq 對該通道中m×p×q個元素同時做批量歸一化,使用相同的均值和方差溪北。
3.預(yù)測時的批量歸?化
訓(xùn)練:以batch為單位,對每個batch計算均值和方差桐绒。
預(yù)測:用移動平均估算整個訓(xùn)練數(shù)據(jù)集的樣本均值和方差。
殘差網(wǎng)絡(luò)(ResNet)
深度學(xué)習(xí)的問題:深度CNN網(wǎng)絡(luò)達到一定深度后再一味地增加層數(shù)并不能帶來進一步地分類性能提高之拨,反而會招致網(wǎng)絡(luò)收斂變得更慢茉继,準確率也變得更差。
殘差塊(Residual Block)
恒等映射:
左邊:f(x)=x
右邊:f(x)-x=0 (易于捕捉恒等映射的細微波動)
稠密連接網(wǎng)絡(luò)(DenseNet)
主要構(gòu)建模塊:
稠密塊(dense block): 定義了輸入和輸出是如何連結(jié)的蚀乔。
過渡層(transition layer):用來控制通道數(shù)烁竭,使之不過大。
過渡層
- 1??1卷積層:來減小通道數(shù)
- 步幅為2的平均池化層:減半高和寬
凸優(yōu)化
- 優(yōu)化方法目標:訓(xùn)練集損失函數(shù)值
- 深度學(xué)習(xí)目標:測試集損失函數(shù)值(泛化性)
優(yōu)化在深度學(xué)習(xí)中的挑戰(zhàn)
- 局部最小值
- 鞍點
- 梯度消失
局部最小值[]
def f(x):
return x * np.cos(np.pi * x)
d2l.set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, f(x))
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
arrowprops=dict(arrowstyle='->'))
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');
鞍點
x = np.arange(-2.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');
梯度消失
x = np.arange(-2.0, 5.0, 0.01)
fig, = d2l.plt.plot(x, np.tanh(x))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)')
fig.axes.annotate('vanishing gradient', (4, 1), (2, 0.0) ,arrowprops=dict(arrowstyle='->'))
凸性
函數(shù)
def f(x):
return 0.5 * x**2 # Convex
def g(x):
return np.cos(np.pi * x) # Nonconvex
def h(x):
return np.exp(0.5 * x) # Convex
x, segment = np.arange(-2, 2, 0.01), np.array([-1.5, 1])
d2l.use_svg_display()
_, axes = d2l.plt.subplots(1, 3, figsize=(9, 3))
for ax, func in zip(axes, [f, g, h]):
ax.plot(x, func(x))
ax.plot(segment, func(segment),'--', color="purple")
# d2l.plt.plot([x, segment], [func(x), func(segment)], axes=ax)
Jensen不等式
性質(zhì)
- 無局部極小值
- 與凸集的關(guān)系
- 二階條件
無局部最小值
證明:假設(shè)存在是局部最小值吉挣,則存在全局最小值,使得,則對
與凸集的關(guān)系
對于凸函數(shù),定義集合
則集合為凸集
證明:對于點有,
故 ,
In [12]:
x, y = np.meshgrid(np.linspace(-1, 1, 101), np.linspace(-1, 1, 101),
indexing='ij')
z = x**2 + 0.5 * np.cos(2 * np.pi * y)
# Plot the 3D surface
d2l.set_figsize((6, 4))
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})
ax.contour(x, y, z, offset=-1)
ax.set_zlim(-1, 1.5)
# Adjust labels
for func in [d2l.plt.xticks, d2l.plt.yticks, ax.set_zticks]:
func([-1, 0, 1])