美文网首页就是杨宗的学习记录
吴恩达DL课程学习笔记——NN & DL(第二周)

吴恩达DL课程学习笔记——NN & DL(第二周)

作者: 就是杨宗 | 来源:发表于2018-06-08 16:41 被阅读1次

    第二周——神经网络基础

    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的联合概率可以转换为连乘的形式) =>
    取负数,将负的训练集的对数似然函数作为目标函数,即成本函数。

    相关文章

      网友评论

      本文标题:吴恩达DL课程学习笔记——NN & DL(第二周)

      本文链接:https://www.haomeiwen.com/subject/equasftx.html