我的GitHub地址:https://github.com/taw19960426/DeepLearning
存放与之对应的python代码
Step1:
Model: y = b + w x c p y=b+w x_{c p} y=b+wxcp
-w和b是参数,w:权重,b:偏差
线性模型: y = b + ∑ w i x i y=b+\sum w_{i} x_{i} y=b+∑wixi
Step2:Goodness of Function
Goodness of Function - -损失函数L:input is a function, output is how bad it is (损失函数)。
损失函数的第一版: L ( w , b ) = ∑ ( y ^ n − ( b + w x c p n ) ) 2 L(w, b)=\sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} L(w,b)=∑(y^n−(b+wxcpn))2
Step3: Best Function
w ∗ b ∗ = arg min w , b L ( w , b ) = arg min w , b ∑ ( y ^ n − ( b + w x c p n ) ) 2 w^{*} b^{*}=\arg \min _{w, b} L(w, b)=\arg \min _{w, b} \sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} w∗b∗=argw,bminL(w,b)=argw,bmin∑(y^n−(b+wxcpn))2
y = b + ∑ w i x i y=b+\sum w_{i} x_{i} y=b+∑wixi
L = ∑ n ( y ^ n − ( b + ∑ w i x i ) ) 2 + λ ( w i ) 2 L=\sum_{n}\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}\right)\right)^{2}+\lambda\left(w_{i}\right)^{2} L=∑n(y^n−(b+∑wixi))2+λ(wi)2
不但要选择一个loss小的function,还要选择一个平滑的function(正则化使函数更平滑, 因为w比较小)
λ \lambda λ大,找出来的function就比较smooth。反之,找出来的则不太smooth. 在由小到大变化的过程中,函数不止要考虑loss最小化还要考虑weights最小化,所以对training error最小化的考虑就会相对(于没有正则化的时候)减小,因此training error会随着增大而增大。test error则先减小再增大。
梯度下降法 - 只要loss func对与它的参数是可微分的就可以用,不需要一定是线性方程
L ( w , b ) = ∑ n = 1 10 ( y ^ n − ( b + w x c p n ) ) 2 ∂ L ∂ w = ∑ n = 1 10 2 ( y ^ n − ( b + w x c p n ) ) ( − x c p n ) ∂ L ∂ b = ∑ n = 1 10 2 ( y ^ n − ( b + w x c p n ) ) ( − 1 ) \begin{array}{l}{L(w, b)=\sum_{n=1}^{10}\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2}} \\\\ {\frac{\partial L}{\partial w}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)\left(-x_{c p}^{n}\right)} \\ \\{\frac{\partial L}{\partial b}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)(-1)}\end{array} L(w,b)=∑n=110(y^n−(b+wxcpn))2∂w∂L=∑n=1102(y^n−(b+wxcpn))(−xcpn)∂b∂L=∑n=1102(y^n−(b+wxcpn))(−1)
假设 θ \theta θ有两个变量 θ 1 , θ 2 \theta_{1}, \theta_{2} θ1,θ2 , 则:
θ 0 = [ θ 1 0 θ 2 0 ] , θ 1 = θ 0 − η ∇ L ( θ 0 ) \theta^{0}=\left[\begin{array}{l}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right], \quad \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right) θ0=[θ10θ20],θ1=θ0−η∇L(θ0)
[ θ 1 1 θ 2 1 ] = [ θ 1 0 θ 2 0 ] − η [ ∂ L ( θ 1 0 ) / ∂ θ 1 ∂ L ( θ 2 0 ) / ∂ θ 2 ] \left[\begin{array}{c}{\theta_{1}^{1}} \\ {\theta_{2}^{1}}\end{array}\right]=\left[\begin{array}{c}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right]-\eta\left[\begin{array}{c}{\partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2}}\end{array}\right] [θ11θ21]=[θ10θ20]−η[∂L(θ10)/∂θ1∂L(θ20)/∂θ2]
这里:
∇ L ( θ ) = [ ∂ L ( θ 1 ) / ∂ θ 1 ∂ L ( θ 2 ) / ∂ θ 2 ] \nabla L(\theta)=\left[\begin{array}{l}{\partial L\left(\theta_{1}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}\right) / \partial \theta_{2}}\end{array}\right] ∇L(θ)=[∂L(θ1)/∂θ1∂L(θ2)/∂θ2]
可以绘制loss vs. No. of parameters updates(同一个循环的参数迭代次数)的曲线,观察变化趋势;
每隔几个时期将学习率降低一些因子,例如: η t = η / t + 1 \eta^{t}=\eta / \sqrt{t+1} ηt=η/t+1
为不同的参数提供不同的学习率-Adagrad-将每个参数的学习率除以其先前导数的均方根
w 1 ← w 0 − η 0 σ 0 g 0 σ 0 = ( g 0 ) 2 w 2 ← w 1 − η 1 σ 1 g 1 σ 1 = 1 2 [ ( g 0 ) 2 + ( g 1 ) 2 ] w 3 ← w 2 − η 2 σ 2 g 2 σ 2 = 1 3 [ ( g 0 ) 2 + ( g 1 ) 2 + ( g 2 ) 2 ] w t + 1 ← w t − η t σ t g t σ t = 1 t + 1 ∑ i = 0 t ( g i ) 2 \begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} & \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} & \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} & \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ & \quad \quad \quad \quad \quad \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} & \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1←w0−σ0η0g0w2←w1−σ1η1g1w3←w2−σ2η2g2wt+1←wt−σtηtgt σ0=(g0)2 σ1=21[(g0)2+(g1)2] σ2=31[(g0)2+(g1)2+(g2)2] σt=t+11i=0∑t(gi)2
η t / σ t \eta^{t} / \sigma^{t} ηt/σt可以消除…然后涉及以下形式:
w t + 1 ← w t − η ∑ i = 0 t ( g i ) 2 g t w^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t} wt+1←wt−∑i=0t(gi)2ηgt
g t = ∂ L ( θ t ) ∂ w g^{t}=\frac{\partial L\left(\theta^{t}\right)}{\partial w} gt=∂w∂L(θt)为当下的梯度值(偏微分) - 造成反差效果
我的GitHub地址:https://github.com/taw19960426/DeepLearning
import numpy as np
import matplotlib.pyplot as plt # plt
#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]
#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2
Z[j][i] = Z[j][i] / len(x_data)
# yadata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 0.0000001 # 学习率
iteration = 100000#迭代次数
#存储绘图的初始值
b_history = [b]
w_history = [w]
# iterations
for i in range(iteration):
b_grad = 0.0
w_grad = 0.0
#L(w,b)对b,w分别求导
for n in range(len(x_data)):
b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0
w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]
#更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^t
b = b - lr * b_grad
w = w - lr * w_grad
# 存储绘图参数
b_history.append(b)
w_history.append(w)
# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
对 b 和 w 给予克制化的Learning Rate:
学习率 lr 改为 1,lr_b = 0 / lr_w = 0 ;
对b、w定制化的学习率lr,采用Adagard
b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
import numpy as np
import matplotlib.pyplot as plt # plt
#相当于x^n和y^n所对应的cp值
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]
#准备三维函数及待投影平面的网格坐标
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y)))
X, Y = np.meshgrid(x, y)
#[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,
# 其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2
Z[j][i] = Z[j][i] / len(x_data)
# yadata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 1 # 学习率
iteration = 100000#迭代次数
#存储绘图的初始值
b_history = [b]
w_history = [w]
#对w,b分别定义学习率,初始化
lr_b=0
lr_w=0
# iterations
for i in range(iteration):
b_grad = 0.0
w_grad = 0.0
#L(w,b)对b,w分别求导
for n in range(len(x_data)):
b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0
w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]
'''
#更新参数相当于第一代版本的W^(t+1)=W^t-(lr)^t*g^t
b = b - lr * b_grad
w = w - lr * w_grad'''
# 对w,b分别赋予不同的学习率lr
# 更新参数相当于第二代版本,加入反差效果,反映二次微分
lr_b=lr_b+b_grad**2
lr_w=lr_w+w_grad**2
#对b、w定制化的学习率lr,采用Adagard
b=b-lr/np.sqrt(lr_b)*b_grad
w=w-lr/np.sqrt(lr_w)*w_grad
# 存储绘图参数
b_history.append(b)
w_history.append(w)
# plot the figure
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
''' contourf() 函数为等高线图填充颜色.
x:指定 X 轴数据。
y:指定 Y 轴数据。
z:指定 X、Y 坐标对应点的高度数据。
colors:指定不同高度的等高线的颜色。
alpha:指定等高线的透明度。
cmap:指定等高线的颜色映射,即自动使用不同的颜色来区分不同的高度区域。
linewidths:指定等高线的宽度。
linestyles:指定等高线的样式'''
plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange')
# ms和marker分别代表指定点的长度和宽度。
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
参考文章: