第二周——神经网络基础
1、二分类问题
(1)二分类器输入为sample feature vector,输出为0和1,用于预测该样本是否为正类,本质上是在计算给定样本,它属于正类的概率。
(2)input sample feature vector作为输入矩阵X的列向量,output label作为输出矩阵y的列向量。
(3)向量是矩阵的特殊形式,标量是向量的特殊形式。
(4)NN的矩阵的表示形式,Y=activation(WX+b),W为权重矩阵,b为偏置向量。
2、logistic回归
(1)计算给定样本,它属于正类的概率,是一个二分类器。
(2)使用sigmoid激活函数的单神经元的网络,y^=logistic(z),z=wx+b
,w为权重向量,x为特征向量,b为偏置值,y^,z和b均为标量。
(3)往线性回归加上了一个非线性激活函数。
(4)more in sigmoid
3、logistic回归的损失函数
(1)针对样本i,损失函数为:L(y^i, yi)=-(ylogy^+(1-y)log(1-y^))
。
这是一个凸函数,loss(w, b)刻画了real output 和 expect output之间的差异。
(2)if y=1, L = -logy^
,调整模型参数使得loss尽可能小,则y^
会尽可能大,则y^会趋近于1,即实际输出会趋近于真实输出;同理,if y=0,则y^会趋近于0。
(3)由于sigmoid函数将z归一化到(0, 1)之间,故y^的取值也只能在0和1之间。
(4)loss刻画了模型在某个样本之上的表现,成本函数cost function J(w, b)刻画了在整个训练集上的表现。
(5)J(w, b)=1/m * sum of loss function。
(6)The cost function is the average of the loss function of the entire training set. We are going to find the parameters w and b that minimize the overall cost function.
(7)logistic回归可以看作是一个使用sigmoid激活函数的单神经元的网络。
(8)机器学习是一个优化问题,我们说学到一个模型,学到这些模型参数,其实就是求解一个优化问题 =>
cost function/loss func作为目标函数(需要使得实际输出趋近于预期输出),优化变量是模型参数,调整模型参数,使得目标函数最小 =>
即找到全局最小值,最小值点即最优解(解空间即参数向量空间)=>
于是就学到了参数,我们就说从数据中学到了模型。
4、梯度下降法
(1)每一轮迭代,每一个min batch(可以是一个样本+label,也可以为整个训练集),update param,确定梯度方向,loss在loss曲面上沿着最速下降方向下降。
(2)如果函数只有一个变量,则使用导数符号d,若函数有多个变量,则使用偏导数符号。
5、导数
(1)导数:对于一元函数(即该函数只有一个变量),即(原)函数的导(函)数,自变量取各个值时,函数在该点的变化率,函数在该点切线的斜率。
(2)偏导:对于多元函数(该函数有多个变量),固定其他自变量,对当前变量求导数,只有当前变量可变,当前变量取各个值时,函数的变化率。
(3)微分:导数刻画了函数的变化率,微分则刻画了函数的增量,当自变量增加了Δx,因变量则增加Δy=Δx×y'。
6、更多导数的例子
主要是讲了如何计算函数的导数,直接看高数书即可。
一些导数计算公式
7、计算图
张量 -> 张量 -> 张量
TensorFlow
forward pass计算模型的输出和loss,backward pass通过链式求导计算loss关于各个模型参数的偏导,即用BP算法计算梯度。
8、在计算图中计算导数
(1)forward pass计算针对这个input-output pair的loss,the loss of min-batch = the average of loss func of min-batch data,该轮迭代的损失=各个min-batch的损失求平均。
(2)loss func是模型参数的函数,但是由于每个input sample和label可能是不一样的,所以每个输入输出对对应的损失函数也可能是不一样的。
(3)BP算法就是在反向地逐层计算梯度。针对每一个input-outpu pair,都会有一个前向和反向过程(非向量化实现)。
(4)y=f(z), z=g(x),复合函数,计算y关于x的导数,链式法则,链式求导,dy/dx=dy/dz * dz/dx。
(5)一个简单的计算图,x -> m -> n -> y,dy/dx = dy/dm * dm/dx。简化表示为,dx = dm * dm/dx。
(6)更多详见下图:
在计算图中计算导数
(7)NN就是一个复合函数,backward pass通过BP算法计算针对这个input-output pair的梯度,求平均得到针对这个min-batch的梯度。
9、单样本训练logistic回归模型
单样本训练logistic回归模型10、基于训练集(有m个输入输出对)训练logistic回归模型
(1)u=f(x), v=g(x), (u+v)' = u' + v'。
(2)我们只画针对一个input-output pair的计算图,针对每一个input-outpu pair,都会有一个前向和反向过程。
(3)这里实际上是一个BGD,求平均,得到针对整个训练集的梯度。
(4)训练的伪代码如下,也就是如何通过BP算法计算梯度,然后利用梯度下降求解该优化问题。
J = 0 // cost func
dw1 = 0 // dJ/dw1
dw2 = 0 // dJ/dw2
db = 0 // dJ/db
// 一轮迭代
for i=1 to m:
// forward pass
zi = wTxi+b // linear model
ai = sigmoid(zi) // the output of logistic regression model
J += -[yi*logai + (1-yi)log(1-ai)] // 每个input-output pair都会计算一个loss
// backward pass
dzi = ai - yi
dw1 += x1i*dzi // 每个input-output pair都会计算dloss/dw1
dw2 += x2i*dzi
db += dzi
J /= m // 得到整个训练集平均的loss
dw1 /= m // 得到针对整个训练集的梯度
dw2 /= m
db /= m
// update model param
w1 := w1 - LR * dw1
w2 := w2 - LR * dw2
b := b - LR * db
11、向量化
如果要计算两个向量的点积,使用np.dot(x, y),向量化,避免显示的for循环(这是串行的)。
CPU和GPU都有SIMD指令,数据并行,加速代码的运行过程。
SIMD和向量化还有待继续学习!!
12、更多向量化的例子
u = np.exp(v)
u = np.log(v)
u = np.abs(v)
u = v**2
u = 1/v
13、向量化logistic回归
通过向量化,避免使用显示的for循环。
每个input sample作为输入矩阵X的列向量。
Z = wTX + b
A = sigmoid(Z)
X -> Z -> A,完成了logistic回归模型的一次forward pass。
14、向量化logistic回归的梯度计算
向量化之后,backward pass如何计算梯度,如何链式求导,还有待进一步学习。
向量化logistic回归的梯度计算
15、Python中的广播
(1)A矩阵和B矩阵为同型矩阵,则A和B可以做element wise的操作,例如+-*/。
(2)若A为m*n
的矩阵,B为(m, 1)或(1, n),或为一个标量,则Python的广播机制会复制堆叠使得B的shape与A一致,使得A和B可以做element wise的操作。
(3)若a为(1, n)的行向量,b为(m, 1)的列向量,它两会先复制堆叠使得shape一致,变成(m, n),然后可以做element wise的操作。
16、Python numpy向量的一些注意事项
(1)不要使用rank 1 array,即不要使用秩为1的数组,例如a = np.random.randn(5),a.shape为(5, ),这是一个秩为1的数组。
(2)使用(5, 1)的矩阵,将它视做列向量,使用(1, 5)的矩阵,将它视做行向量。
(3)使用断言来判断变量的shape,assert(a.shape == (5, 1))
(4)将shape为(5, )的变量通过reshape操作变为shape为(5, 1)的矩阵,即列向量。
17、logistic回归成本函数的一些解释
我们基于有标签数据集以监督学习的方式训练模型 =>
基于MLE的思想,既然该数据集出现了,则认为该数据集有这样的一些label概率是最大的 =>
调整模型参数,使得该概率最大 =>
由于label已知,而模型参数未知,故为似然函数 =>
取对数是为了易于计算(由于样本标签取值是条件独立的,所以该数据集有这样的一些label的联合概率可以转换为连乘的形式) =>
取负数,将负的训练集的对数似然函数作为目标函数,即成本函数。
网友评论