给定输入x, 权重w, 和偏移 b, 感知机输出:
o = σ ( < w , x > + b ) o = \sigma(
σ ( x ) = { 1 i f x > 0 − 1 o t h e r w i s e \sigma(x)=\left\{ \begin{matrix} 1 & if x>0 \\ -1 & otherwise \end{matrix} \right. σ(x)={1−1ifx>0otherwise
(是个二分类问题)
initialize w=0 and b = 0
repeat #每次拿1个sample来优化
if y i [ < w , x i > + b ] ⩽ 0 y_i[
w ← w + y i x i w \leftarrow w + y_ix_i w←w+yixi and b ← b + y i b \leftarrow b + y_i b←b+yi
end if
until all classified correctly
等价于使用批量大小为1的梯度下降,并使用如下的损失函数:
l ( y , x , w ) = m a x ( 0 , − y < w , x > ) l(y,x,w) = max(0, -y
感知机不能拟合XOR函数,它只能产生线性分割面导致AI的第一次寒冬
单隐藏层-单分类
输入 x ∈ R n x \in R^n x∈Rn
隐藏层 W 1 ∈ R m × n W_1 \in R^{m \times n} W1∈Rm×n, b 1 ∈ R m b_1 \in R^m b1∈Rm
输出层 w 2 ∈ R m , b 2 ∈ R w_2 \in R^m, b_2 \in R w2∈Rm,b2∈R
h = σ ( W 1 x + b 1 ) h = \sigma(W_1x + b_1) h=σ(W1x+b1) # h是向量
o = w 2 T h + b 2 o = w_2^Th + b_2 o=w2Th+b2 #o是标量
σ \sigma σ 是按元素的激活函数 #激活函数必须是非线性的,否则再多层也是线性模型
常用激活函数:sigmoid[0,1],
Tanh, ReLU(x)=max(x,0)
y 1 , y 2 , . . . y k = s o f t m a x ( o 1 , o 2 , . . . , o k ) y_1, y_2, ...y_k = softmax(o_1,o_2,...,o_k) y1,y2,...yk=softmax(o1,o2,...,ok), 把所有o拉到[0,1]使得加起来=1
-多分类
输入 x ∈ R n x \in R^n x∈Rn
隐藏层 W 1 ∈ R m × n , b 1 ∈ R m W_1 \in R^{m \times n}, b_1 \in R^m W1∈Rm×n,b1∈Rm
输出层 W 2 ∈ R m × k , b 2 ∈ R k W_2 \in R^{m \times k}, b_2 \in R^k W2∈Rm×k,b2∈Rk
h = σ ( W 1 x + b 1 ) h = \sigma(W_1x + b_1) h=σ(W1x+b1) o = W 2 T h + b 2 o = W_2^Th + b_2 o=W2Th+b2
y = s o f t m a x ( o ) y = softmax(o) y=softmax(o) # h、o、y都是向量
多隐藏层
h 1 = σ ( W 1 x + b 1 ) h_1 = \sigma(W_1x + b_1) h1=σ(W1x+b1)
h 2 = σ ( W 2 h 1 + b 2 ) h_2 = \sigma(W_2h_1 + b_2) h2=σ(W2h1+b2)
h 3 = σ ( W 3 h 2 + b 3 ) h_3 = \sigma(W_3h_2 + b_3) h3=σ(W3h2+b3)
o = W 4 h 3 + b 4 o = W_4h_3 + b_4 o=W4h3+b4 #o是向量
超参数:隐藏层数、每层隐藏层的大小
总结:
多层感知机使用隐藏层和激活函数来得到非线性模型
常用激活函数是Sigmoid, Tanh, ReLU
使用Softmax 来处理多类分类(包含于nn.crossEntropyLoss中)
超参数:隐藏层层数和层大小
实战代码:D:\MLProjects\0102MLP
#打开visdom: 在【Pytorch】环境下 python -m visdom.server
1)解决训练数据稀缺的方法:
K折交叉验证:原始训练数据被分成K个不重叠的子集。然后进行K次模型训练和验证,每次在K - 1 个子集上进行训练,并在剩余的子集上进行验证。最后,通过对K次实验的结果取平局来估计训练和验证误差。
2)欠拟合和过拟合
多项式回归,代码见D:\MLProjects\0104polynomial regression
线性函数 f ( x ) = w T x f(x) =w^Tx f(x)=wTx, w 和 x均为向量
线性回归损失:
L ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w T x ( i ) + b − y ( i ) ) 2 L(w,b) = \frac{1}{n} \sum_{i=1}^{n}\frac{1}{2}(w^Tx^{(i)} + b - y^{(i)})^2 L(w,b)=n1i=1∑n21(wTx(i)+b−y(i))2
(w, b)是权重和偏置参数
限制||w||的大小:
||w|| = ||w||_2(L2范数), λ > 0 \lambda > 0 λ>0
L ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 L(w,b) + \frac{ \lambda}{2}||w||^2 L(w,b)+2λ∣∣w∣∣2
L2正则化回归的小批量随机梯度下降更新如下式:
w ← ( 1 − η λ ) w − η ∣ B ∣ ∑ i ∈ B x ( i ) ( w T x ( i ) + b − y ( i ) ) w \leftarrow (1 - \eta \lambda)w - \frac{\eta}{|B|}\sum_{i \in B}x^{(i)}(w^Tx^{(i)} + b - y^{(i)}) w←(1−ηλ)w−∣B∣ηi∈B∑x(i)(wTx(i)+b−y(i))
较小的 λ \lambda λ对应于较小约束的w, 而较大的 λ \lambda λ对w的约束更大
权重衰减 代码见D:\MLProjects\0106WeightDecay
h ′ = { 0 概率为 p h 1 − p 其他情况 h' = \left\{\begin{matrix} 0 & 概率为p \\ \frac{h}{1-p} & 其他情况 \end{matrix}\right. h′={01−ph概率为p其他情况
E [ h ′ ] = h E[h'] = h E[h′]=h
Dropout 代码见D:\MLProjects\0107Dropout
前向传播:指的是按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
单隐藏层的MLP:
(例如Fashion-mnist上的MLP)
假设 x ∈ R d x \in R^d x∈Rd, 并且隐藏层不包括偏置项;
中间变量: z = W ( 1 ) x z = W^{(1)}x z=W(1)x , 其中 W ( 1 ) ∈ R h × d W^{(1)} \in R^{h \times d} W(1)∈Rh×d是隐藏层的权重参数。 z ∈ R h z \in R^h z∈Rh
h = ϕ ( z ) h = \phi(z) h=ϕ(z);
o = W ( 2 ) h o = W^{(2)}h o=W(2)h, W ( 2 ) ∈ R q × h , o ∈ R q W^{(2)} \in R^{q \times h}, o \in R^q W(2)∈Rq×h,o∈Rq;
假设损失函数为l, 样本标签为y,计算单个数据样本的损失项:
L = l ( o , y ) L = l(o, y) L=l(o,y)
根据 L 2 L_2 L2正则化的定义, 给定超参数 λ \lambda λ, 正则化项为:
s = λ 2 ( ∣ ∣ W ( 1 ) ∣ ∣ F 2 + ∣ ∣ W ( 2 ) ∣ ∣ F 2 ) s = \frac{\lambda}{2}(||W^{(1)}||_F^2 + ||W^{(2)}||_F^2) s=2λ(∣∣W(1)∣∣F2+∣∣W(2)∣∣F2)
其中矩阵的Frobenius范数是将矩阵展平为向量后应用 L 2 L_2 L2范数。
模型在给定数据样本上的正则化损失为:
J = L + s J = L+s J=L+s
J J J称为目标函数
链式法则:
Y = f (X), Z = g(Y)
∂ Z ∂ X = p r o d ( ∂ Z ∂ Y , ∂ Y ∂ X ) \frac{\partial Z}{\partial X} = prod(\frac{\partial Z}{\partial Y},\frac{\partial Y}{\partial X}) ∂X∂Z=prod(∂Y∂Z,∂X∂Y)
prod运算符:执行必要的操作(如换位和交换位置)后将其参数相乘。
目的是计算 ∂ J / ∂ W ( 1 ) \partial J / \partial W^{(1)} ∂J/∂W(1) 和 ∂ J / ∂ W ( 2 ) \partial J / \partial W^{(2)} ∂J/∂W(2)
∂ J ∂ L = 1 , ∂ J ∂ s = 1 \frac{\partial J}{\partial L}=1,\frac{\partial J}{\partial s}=1 ∂L∂J=1,∂s∂J=1
∂ s ∂ W ( 1 ) = λ W ( 1 ) \frac{\partial s}{\partial W^{(1)}} = \lambda W^{(1)} ∂W(1)∂s=λW(1)
∂ s ∂ W ( 2 ) = λ W ( 2 ) \frac{\partial s}{\partial W^{(2)}} = \lambda W^{(2)} ∂W(2)∂s=λW(2)
现在可以计算最接近输出层的模型参数的梯度 ∂ J ∂ W ( 2 ) ∈ R q × h \frac{\partial J}{\partial W^{(2)}} \in R^{q \times h} ∂W(2)∂J∈Rq×h.使用链式法则得出:
∂ J ∂ W ( 2 ) = p r o d ( ∂ J ∂ o , ∂ o ∂ W ( 2 ) ) + p r o d ( ∂ J ∂ s , ∂ s ∂ W ( 2 ) ) = ∂ J ∂ o h T + λ W ( 2 ) \frac{\partial J}{\partial W^{(2)}}=prod(\frac{\partial J}{\partial o}, \frac{\partial o}{\partial W^{(2)}}) + prod(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial W^{(2)}}) = \frac{\partial J}{\partial o}h^T + \lambda W^{(2)} ∂W(2)∂J=prod(∂o∂J,∂W(2)∂o)+prod(∂s∂J,∂W(2)∂s)=∂o∂JhT+λW(2)
为了获得关于 W ( 1 ) W^{(1)} W(1)的梯度,我们需要继续沿着输出层到隐藏层反向传播。关于隐藏层输出的梯度 ∂ J ∂ h ∈ R h \frac{\partial J}{\partial h} \in R^h ∂h∂J∈Rh由下式给出:
∂ J ∂ h = p r o d ( ∂ J ∂ o , ∂ o ∂ h ) = W ( 2 ) T ∂ J ∂ o \frac{\partial J}{\partial h} = prod(\frac{\partial J}{\partial o}, \frac{\partial o}{\partial h}) = {W^{(2)}}^T\frac{\partial J}{\partial o} ∂h∂J=prod(∂o∂J,∂h∂o)=W(2)T∂o∂J
由于激活函数 ϕ \phi ϕ是按元素计算的,计算中间变量 z z z的梯度 ∂ J / ∂ z ∈ R h \partial J/ \partial z \in R^h ∂J/∂z∈Rh 需要使用按元素乘法运算符,用 ⨀ \bigodot ⨀表示:
∂ J ∂ z = p r o d ( ∂ J ∂ h , ∂ h ∂ z ) = ∂ J ∂ h ⨀ ϕ ′ ( z ) \frac{\partial J}{\partial z} = prod(\frac{\partial J}{\partial h}, \frac{\partial h}{\partial z}) = \frac{\partial J}{\partial h}\bigodot\phi'(z) ∂z∂J=prod(∂h∂J,∂z∂h)=∂h∂J⨀ϕ′(z)
最后得到最接近输入层的模型参数的梯度 ∂ J / ∂ W ( 1 ) ∈ R h × d \partial J / \partial W^{(1)} \in R^{h \times d} ∂J/∂W(1)∈Rh×d,根据链式法则,得:
∂ J ∂ W ( 1 ) = p r o d ( ∂ J ∂ z , ∂ z ∂ W ( 1 ) ) + p r o d ( ∂ J ∂ s , ∂ s ∂ W ( 1 ) ) = ∂ J ∂ z x T + λ W ( 1 ) \frac{\partial J}{\partial W^{(1)}} = prod(\frac{\partial J}{\partial z},\frac{\partial z}{\partial W^{(1)}}) +prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial W^{(1)}}) = \frac{\partial J}{\partial z}x^T + \lambda W^{(1)} ∂W(1)∂J=prod(∂z∂J,∂W(1)∂z)+prod(∂s∂J,∂W(1)∂s)=∂z∂JxT+λW(1)
梯度消失和梯度爆炸
h ( l ) = f l ( h ( l − 1 ) ) h^{(l)} = f_l(h^{(l-1)}) h(l)=fl(h(l−1)),因此 o = f L ∘ . . . ∘ f 1 ( x ) o= f_L \circ...\circ f_1(x) o=fL∘...∘f1(x).
o关于任何一组参数 W ( l ) W^{(l)} W(l)的梯度写为下式:
∂ W ( l ) o = ∂ h ( L − 1 ) h ( L ) . . . ∂ h ( l ) h ( l + 1 ) ∂ w ( l ) h ( l ) \partial _{W^{(l)}}o = \partial_{h^{(L-1)}}h^{(L)}...\partial_{h^{(l)}}h^{(l+1)}\partial_{w^{(l)}}h^{(l)} ∂W(l)o=∂h(L−1)h(L)...∂h(l)h(l+1)∂w(l)h(l)
换言之,该梯度是L-1个矩阵 M ( L ) . . . M ( l + 1 ) M^{(L)}... M^{(l + 1)} M(L)...M(l+1) 与梯度向量 v ( l ) v^{(l)} v(l)的乘积
代码实现见D:\MLProjects\0109gradient vanish,explode
通过将基于模型的决策引入环境,我们可能会破坏模型。
条件概率:
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B) = \frac{P(AB)}{P(B)} P(A∣B)=P(B)P(AB)
“A在B发生的条件下”发生的概率 P ( A ∣ B ) P(A|B) P(A∣B)
A,B同时发生的概率,联合概率 P ( A B ) = P ( A , B ) = P ( A ∩ B ) P(AB)=P(A,B)=P(A\cap B) P(AB)=P(A,B)=P(A∩B)
1)协变量偏移
假设:虽然输入的分布可能随时间而改变,但标签函数(条件分布P(y|x))没有改变,称之为协变量偏移(covariate shift)
2)标签偏移(label shift)
假设标签边缘概率P(y)可以改变,但类别条件分布P(x|y)在不同的领域之间保持不变。
3)概念偏移(concept shift)
分布偏移纠正:
经验风险与实际风险
训练数据 { ( x 1 , y 1 ) , . . . , ( x n , y n ) } \{(x_1,y_1), ...,(x_n, y_n)\} {(x1,y1),...,(xn,yn)},在每一个小批量之后更新模型f的参数(不考虑正则化):
最小化
1 n ∑ i = 1 n l ( f ( x i ) , y i ) (经验风险) \frac{1}{n}\sum_{i=1}^nl(f(x_i), y_i) \tag{经验风险} n1i=1∑nl(f(xi),yi)(经验风险)经验风险是为了近似真实风险
整个训练数据上的平均损失,即从其真实分布p(x,y)中抽取的所有数据的总体损失的期望值:
E p ( x , y ) [ l ( f ( x ) , y ) ] = ∬ l ( f ( x ) , y ) p ( x , y ) d x d y (真实风险) E_{p(x,y)}[l(f(x),y)] = \iint l(f(x),y)p(x,y) dxdy \tag{真实风险} Ep(x,y)[l(f(x),y)]=∬l(f(x),y)p(x,y)dxdy(真实风险)
协变量偏移纠正
m i n i m i z e 1 n ∑ i = 1 n β i l ( f ( x i ) , y i ) ([1]) minimize \frac{1}{n}\sum_{i=1}^n\beta_il(f(x_i),y_i) \tag{[1]} minimizen1i=1∑nβil(f(xi),yi)([1])
完整协变量偏移纠正算法:
假设我们有一个训练集 { ( x i , y 1 ) , . . . , ( x n , y n ) } \{(x_i,y_1),...,(x_n,y_n)\} {(xi,y1),...,(xn,yn)} 和一个未标记的测试集
{ u 1 , . . . , u m } \{u_1, ...,u_m\} {u1,...,um}。对于协变量偏移,我们假设1<= i <=n的 x i x_i xi来自某个源分布, u i u_i ui来自目标分布。
1.生成一个二元分类训练集: { ( x 1 , − 1 ) , . . . , ( x n , − 1 ) , ( u 1 , 1 ) , . . . , ( u m , 1 ) } \{(x_1, -1), ..., (x_n,-1), (u_1,1),...,( u_m, 1)\} {(x1,−1),...,(xn,−1),(u1,1),...,(um,1)}
2.用对数几率回归训练二元分类器得到函数h。
3.使用 β i = e x p ( h ( x i ) ) \beta_i = exp(h(x_i)) βi=exp(h(xi))或更好的 β i = m i n ( e x p ( h ( x i ) ) , c ) \beta_i =min(exp(h(x_i)),c) βi=min(exp(h(xi)),c)(c为常量)对训练数据进行加权。
4.使用权重 β i \beta_i βi进行([1])中 { ( x i , y 1 ) , . . . , ( x n , y n ) } \{(x_i,y_1),...,(x_n,y_n)\} {(xi,y1),...,(xn,yn)}的训练。
标签偏移纠正
假设处理k个类别的分类任务。q,p分别是源分布(训练时的分布)和目标分布(测试时的分布)。假设标签的分布随时间变化: q ( y ) ≠ p ( y ) q(y) \neq p(y) q(y)=p(y), 但类别条件分布保持不变 q ( x ∣ y ) = p ( x ∣ y ) q(x|y) = p(x|y) q(x∣y)=p(x∣y)。
如果源分布q(y)是“错误的”, 可以根据真实风险恒等式进行更正:
∬ l ( f ( x ) , y ) p ( x ∣ y ) p ( y ) d x d y = ∬ l ( f ( x ) , y ) q ( x ∣ y ) q ( y ) p ( y ) q ( y ) d x d y \iint l(f(x),y)p(x|y)p(y)dxdy = \iint l(f(x),y)q(x|y)q(y)\frac{p(y)}{q(y)}dxdy ∬l(f(x),y)p(x∣y)p(y)dxdy=∬l(f(x),y)q(x∣y)q(y)q(y)p(y)dxdy
重要性权重将对于于标签似然比率:
β i = p ( y i ) q ( y i ) \beta_i = \frac{p(y_i)}{q(y_i)} βi=q(yi)p(yi)
1.采用现成发分类器(基于训练数据训练的)并使用验证集(也来自训练分布)计算其混淆矩阵C:k × \times × k 矩阵,列对于于标签类别,行对于于模型的预测类别,每个单元格的值 c i j c_{ij} cij是验证集中,真实标签为j,而模型预测为i的样本数量所占的比例。
2.所有模型在测试时的预测取平均数,得到平均模型输出 μ ( y ^ ) ∈ R k \mu (\hat y) \in R^k μ(y^)∈Rk
3. p ( y ) = C − 1 μ ( y ^ ) p(y) = C^{-1}\mu (\hat y) p(y)=C−1μ(y^)
4.观测源数据上的标签,很容易计算估计分布q(y)。
5.计算权重 β i \beta_i βi,并将其代入([1])中。
概念偏移纠正
eg.由于环境的磨损,交通摄像头的箭头会逐渐退化,影响摄像头的图像质量;
新闻内容逐渐变化(即新新闻的出现)。
使用新数据更新现有的网络权重,而不是从头开始训练。
学习问题的分类:
1)批量学习:batch learning
2)在线学习 online learning:
m o d e l : f t → d a t a : x t → e s t i m a t e : f t ( x t ) → o b s e r v a t i o n : y t model: f_t →data: x_t →estimate: f_t(x_t) →observation: y_t model:ft→data:xt→estimate:ft(xt)→observation:yt → l o s s : l ( y t , f t ( x t ) ) loss :l(y_t,f_t(x_t)) loss:l(yt,ft(xt)) → m o d e l : f t + 1 model: f_{t+1} model:ft+1
在这个循环中,给定新的观测结果,我们会不断改进我们的模型。
3)老虎机bandits
4)控制
5)强化学习 reinforcement learning