zoukankan      html  css  js  c++  java
  • [吴恩达深度学习]神经网络和深度学习

    神经网络和深度学习

    深度学习概论

    什么是神经网络

    神经网络是一个受大脑工作方式启发而得的有效学习算法

    单一神经网络:给定一维数据,如房屋面积,创建一个 (ReLU) (线性整流函数)函数,映射出房屋价格。

    多元神经网络:多维数据预测结果,自动生成隐藏单元,只需给定输入输出数据集让模型自己去学习。

    用神经网络进行监督学习

    房地产价格预测 标准神经网络
    图像识别 卷积神经网络 (CNN)
    音频、语言 循环神经网络 (RNN)
    雷达信号、模型识别等 复杂的混合神经网络

    结构化数据:数据库或数据序列,每个特征都有清晰的定义

    非结构化数据:音频、图像、文本,特征可以是图像的像素值或文本内的单词

    为什么深度学习流行起来

    1. 传统模型性能上限。传统模型适用于小型数据处理,到达性能上限后数据量增加也不能明显提高性能
    2. 数据量增大。传统模型不适用处理海量数据
    3. 深度学习模型性能依赖数据量。深度学习模型学习越多数据性能越好。
    4. 新的算法催动计算速度的更新,从而催生新的想法,继续推动计算速度更新

    规模 (模型规模、数据规模) 推动深度学习性能增长。

    神经网络基础

    二分分类

    举例:二分类一个 64*64 的图片,判断是否为猫,输出 1 (cat) or 0 (not cat)。

    图像在计算机中的存储通常为三个 64*64 的矩阵,分布对应 Red、Green、Blue 三种像素的亮度。

    将三个矩阵映射到一个特征向量 (X) 中,将每个矩阵中的值,按行逐个读取,组成一个大的 12288*1 的向量 ( 64 x 64 x 3 = 12288 )。用 (n = 12288) 表示特征向量的维度。

    那么二分类模型的作用就是对于输入的特征变量 (x) 输出结果标签 (y) 来预测是否是猫。

    一般记训练集有 (m) 个训练样本,其中 ((x^{(1)},y^{(1)})) 表示第1个样本输入 (x^{(1)}) 输出 (y^{(1)}),为了区分,记训练集为 (m_{train}) 测试集为 (m_{test})。用 (X=(x^{(1)},x^{(2)},...,x^{(m)})) 记为所有特征变量的集合。那么 (X=n * m),是特征维度*训练样本个数

    Logistic Regression

    计算 (widehat{y}=P(y=1|x) in (0,1)),其中 (x) 是一个特征变量,给定 (x),参数 (w) (也是一个向量) 和参数 (b),输出 (widehat{y}=sigma(w^Tx+b)) ((sigma(z))(Sigmoid) 函数,将输出映射到 (0,1))

    [widehat{y}=sigma(z)=frac{1}{1+e^{-z}}quad z=w^Tx+b ]

    损失函数:损失函数是在单个样本上体现的,衡量了单个样本的表现。因为 (L-2) norm 在后续的梯度下降求最优值中表现不好,所以 (Logistic Regression) 使用

    [L(widehat{y},y)=-(ylogwidehat{y}+(1-y)log(1-widehat{y})) ]

    • 如果 (y=1)(L(widehat{y},y)=-logwidehat{y}),想要 (L(widehat{y},y)) 尽量小,就要 (logwidehat{y}) 尽量大,因为 (widehat{y}) 是经过 (Sigmoid) 函数映射后的结果,(widehat{y}in (0,1)),所以 (widehat{y}) 越大越接近真实值
    • 同理 (y=0)(L(widehat{y},y)=-log(1-widehat{y})),就要 (log(1-widehat{y})) 尽量大,那么 (widehat{y}) 要尽量小

    成本函数:基于参数的总成本,反映整体训练样本的表现。

    [J(w,b)=frac{1}{m}sum_{i=0}^mL(widehat{y}^{(i)},y^{(i)}) ]

    • (m) 是训练样本个数
    • (L(widehat{y}^{(i)},y^{(i)})) 表示第 (i) 个训练样本的损失函数

    前向反向传播

    前向就是正常的计算顺序,反向传播是计算导数的顺序 (链式法则)

    程序里 (dvar) 表示导数

    Logistic 回归的梯度下降法

    [egin{array}{l}{z=w^{T} x+b} \ {hat{y}=a=sigma(z)} \ {mathcal{L}(a, y)=-(y log (a)+(1-y) log (1-a))}end{array} ]

    单个样本:假设特征值只有两个,(w=(w_1,w_2)^T),输入 (w_1,x_1,w_2,,x_2,b),则 (z=w_1x_1+w_2x_2+b),则 (widehat{y}=a=sigma(z)),最后计算 (L(a,y))。在 (Logistic) 回归中要做的就是改变 (w_1,w_2,b) 的值使得 (L(a,y)) 最小。

    一次梯度更新的步骤:

    [egin{array}{l}{w_{1}:=w_{1}-alpha d w_{1}} \ {w_{2}:=w_{2}-alpha d w_{2}} \ {b:=b-alpha}end{array} ]

    向量化

    向量化通常是消去程序中显式 (for) 循环的艺术。向量计算和 (for) 循环之间的计算速度差异差不多是 300 倍。尽可能避免使用 (for) 循环!

    numpy 库内置了许多向量函数,将 (w) 向量化,程序中调用 (np.zeros()),将训练集 (X) 和偏置 (b) 向量化

    python的广播

    1. 不要使用 shape 为 ((n,)) 这种秩为 1 的数组。使用(a=np.random.randn(5,1)) 这种声明具体大小的语句
    2. 如果已经得到了 ((n,)) 这种秩为 1 的数组,可以使用 reshape 转换
    3. 随意申明 assert 语句,使用断言,确定矩阵的 shape,及时发现bug

    浅层神经网络

    神经网络表示

    输入层、隐藏层、输出层,但输入层一般不看做一个标准层,从隐藏层开始对网络层数计数,数学标记 (a^{[n]}_i) 表示第 (n) 层网络的第 (i) 个节点的结果。

    神经网络的输出

    类比 (Logistic) 回归中的计算, (Logistic) 回归中先计算 (z=w^Tx+b),再计算 (a=sigma(z)=widehat{y}),单隐藏层的神经网络就是对每一个节点 (a^{[1]}_i) 都计算一遍 (z^{[1]}_i=w^{[1]T}_ix+b^{[1]}_i)

    激活函数

    (Sigmoid)(tanh)(ReLU)(Leaky ReLU)

    函数名 利弊
    Sigmoid 除了二分类问题其他很少使用,输出区间在(0,1),不利于数据中心化
    tanh 性能很好,中心对称,比sigmoid常用
    ReLU 默认激活函数,梯度下降很友好
    Leaky ReLU 弥补ReLU在小于0的部分梯度为0的问题,但很少使用

    随机初始化

    权重矩阵不宜太大,一般0.01合适,权重矩阵太大会导致 (z) 值过大,落在激活函数的平缓部分,梯度下降小,学习速度减慢。

    深层神经网络

    技术上来说,(Logistic) 回归是单层神经网络。

    正向传播是时候还是要用 (for) 循环的。

    前几层识别简单的特征,后面的就可识别更复杂的特征,比如脸的轮廓 ( ightarrow) 五官 ( ightarrow) 脸部,音位 ( ightarrow) 单词 ( ightarrow) 词组 ( ightarrow) 句子

    深度学习就是听着唬人,搁以前都叫有很多隐藏层的神经网络。。

    超参数:控制实际参数的参数

    不知道超参数如何取最优值,需要多次实验,练成超参数直觉。。 玄学学习率和超参 。。。

  • 相关阅读:
    数据可视化——Matplotlib模块入门
    小甲鱼第23,24课后练习
    小甲鱼第28课课后练习
    小甲鱼第27课课后练习
    小甲鱼第25课课后练习
    小甲鱼第21课课后练习
    Java:泛型(一)
    决心考研之后
    Java:null
    树:哈夫曼编码解码及压缩存储
  • 原文地址:https://www.cnblogs.com/ColleenHe/p/11704342.html
Copyright © 2011-2022 走看看