自然语言处理 第八期

神经网络基础

  1. 前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数的概念。
  2. 感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。
  3. 激活函数的种类以及各自的提出背景、优缺点。(和线性模型对比,线性模型的局限性,去线性化)
  4. 深度学习中的正则化(参数范数惩罚:L1正则化、L2正则化;数据集增强;噪声添加;early stop;Dropout层)、正则化的介绍。
  5. 深度模型中的优化:参数初始化策略;自适应学习率算法(梯度下降、AdaGrad、RMSProp、Adam;优化算法的选择);batch norm层(提出背景、解决什么问题、层在训练和测试阶段的计算公式);layer norm层。

一、前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数的概念

  1. 前馈神经网络:在前馈神经网络中,各神经元分别属于不同的层。每一层的神经元可以接
    收前一层神经元的信号,并产生信号输出到下一层。
  2. 网络层数:除了输入层的其他所有层数的总和。
  3. 输入层:第0层叫输入层;
  4. 隐藏层:除输入层和输出层以外的其他各层叫做隐藏层,隐藏层不直接接受外界的信号,也不直接向外界发送信号 ;
  5. 输出层:最后一层叫输出层;
  6. 隐藏单元:构成隐藏层的单元;
    神经网络
  7. 激活函数:激活函数在神经元中非常重要的。为了增强网络的表示能力和学习能
    力,激活函数需要具备以下几点性质
    1)连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以
    直接利用数值优化的方法来学习网络参数。
    2)激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
    3)激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,
    否则会影响训练的效率和稳定性。

二、感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。

  1. 感知机:感知机模型是机器学习当中的一个二分类器模型,并且是一种线性分类器。模型的输入为样本的特征,输出为样本类别,或者称之为样本标记。

  2. 利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。

# coding:utf-8
 
import tensorflow as tf
from numpy.random import RandomState
 
# 使用命名空间定义元素,便于使用tensorboard查看神经网络图形化
with tf.name_scope('graph_1') as scope:
    batch_size = 500  # 神经网络训练集batch大小为500
    # 定义神经网络的结构,输入为2个参数,隐藏层为10个参数,输出为1个参数
    # w1为输入到隐藏层的权重,2*10的矩阵(2表示输入层有2个因子,也就是两列输入,10表示隐藏层有10个cell)
    w1 = tf.Variable(tf.random_normal([2, 10], stddev=1, seed=1), name='w1')
    # w2为隐藏层到输出的权重,10*1的矩阵(接受隐藏的10个cell输入,输出1列数据)
    w2 = tf.Variable(tf.random_normal([10, 1], stddev=1, seed=1), name='w2')
    # b1和b2均为一行,列数对应由w1和w2的列数决定
    b1 = tf.Variable(tf.random_normal([1, 10], stddev=1, seed=1), name='b1')
    b2 = tf.Variable(tf.random_normal([1, 1], stddev=1, seed=1), name='b2')
 
    # 维度中使用None,则可以不规定矩阵的行数,方便存储不同batch的大小。(占位符)
    x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
    y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
 
    # 定义神经网络前向传播的过程,定义了1层隐藏层。
    # 输入到隐藏、隐藏到输出的算法均为逻辑回归,即y=wx+b的模式
    a = tf.add(tf.matmul(x, w1, name='a'), b1)
    y = tf.add(tf.matmul(tf.tanh(a), w2, name='y'), b2)  # 使用tanh激活函数使模型非线性化
    y_hat = tf.sigmoid(y)  # 将逻辑回归的输出概率化
 
    # 定义损失函数和反向传播的算法,见吴恩达视频课程第二周第三节课,逻辑回归的损失函数
    cross_entropy = - \
        tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y_hat, 1e-10, 1.0)) +
                       (1-y_)*tf.log(tf.clip_by_value((1-y_hat), 1e-10, 1.0)))
    # 方差损失函数,逻辑回归不能用
    # cost = -tf.reduce_mean(tf.square(y_ - y_hat))
    # clip_by_value函数将y限制在1e-10和1.0的范围内,防止出现log0的错误,即防止梯度消失或爆发
    
    train_step = tf.train.AdamOptimizer(0.0001).minimize((cross_entropy))  # 反向传播算法
 
    # 通过随机数生成一个模拟数据集
    rdm = RandomState(1)  # rdm为伪随机数发生器,种子为1
    dataset_size = 128000
    X = rdm.rand(dataset_size, 2)  # 生成随机数,大小为128000*2的矩阵
    # x_hat = rdm.rand(1, 2)
    x_hat = []
    x_hat.append(list(X[300]))
    print(x_hat)
 
    # 打标签,所有x1+x2<1的都被认为是正样本,其余为负样本。
    Y = [[int(x1+x2 < 1)] for (x1, x2) in X]  # 列表解析格式
    # 若x1+x2 <1为真,则int(x1+x2 <1)为1,若假,则输出为0
 
 
# 创建会话
with tf.Session() as sess:
    writer = tf.summary.FileWriter("logs/", sess.graph)
    init_op = tf.global_variables_initializer()  # 所有需要初始化的值
    sess.run(init_op)  # 初始化变量
    print(sess.run(w1))
    print(sess.run(w2))
    print('x_hat =', x_hat, 'y_hat =', sess.run(y_hat, feed_dict={x: x_hat}))
 
 
 
    STEPS = 100000
    for i in range(STEPS):
        # 每次从数据集中选batch_size个数据进行训练
        start = (i * batch_size) % dataset_size  # 训练集在数据集中的开始位置
        # 结束位置,若超过dataset_size,则设为dataset_size
        end = min(start + batch_size, dataset_size)
        
        # 通过选取的样本训练神经网络并更新参数
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        if i % 1000 == 0:
            # 每隔一段时间计算在所有数据上的损失函数并输出
            total_cross_entropy = sess.run(
                cross_entropy, feed_dict={x: X, y_: Y})
            total_w1 = sess.run(w1)
            total_b1 = sess.run(b1)
            total_w2 = sess.run(w2)
            total_b2 = sess.run(b2)
            print("After %d training steps(s), cross entropy on all data is %g" % (
                i, total_cross_entropy))
            print('w1=', total_w1, ',b1=', total_b1)
            print('w2=', total_w2, ',b2=', total_b2)
 
    # 在训练之后神经网络权重的值
    print(sess.run(w1))
    print(sess.run(w2))
    print('x_hat =', x_hat, 'y_hat =', sess.run(y_hat, feed_dict={x: x_hat}))

三、激活函数的种类以及各自的提出背景、优缺点。

  1. Sigmoid 型激活函数:Sigmoid型函数是指一类S型曲线函数,为两端饱和函数。常用的Sigmoid
    型函数有Logistic函数和Tanh函数。
    (1) Logistic函数
    在这里插入图片描述
    (2) Tanh函数
    在这里插入图片描述
    两个函数图像入如下:
    在这里插入图片描述

  2. Hard-LogisticHard-Tanh 函数

    用分段来近似Logistic函数,得到
    hard-logistic

    Tanh函数也可以用分段函数hard-tanh(x)来近似
    hard-tanh
    两者的图像:
    图像

  3. 修正线性单元(Rectified Linear Unit,ReLU
    ReLU实际上是一个斜坡(ramp)函数,定义为:
    ReLU

  4. 指数线性单元(Exponential Linear Unit,ELU
    ELU是一个近似的零中心化的非线性函数,其定义为:
    -

  5. Softplus 函数
    Softplus函数可以看作是rectifier函数的平滑版本,其定义为:
    Softplus(x) = log(1 + exp(x))
    Softplus函数虽然也有具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。

ReLU、Leaky ReLU、ELU以及Softplus函数的示例
--

  1. Swish 函数
    Swish 函数是一种自门控(Self-Gated)激活函数,定义为
    swish(x) = xσ(βx)
    其中σ(·)为Logistic函数,β 为可学习的参数或一个固定超参数。σ(·) ∈ (0, 1)可以看做是一种软性的门控机制。当σ(βx)接近于1时,门处于“开”状态,激活函数的输出近似于x本身;当σ(βx)接近于0时,门的状态为“关”,激活函数的输出近似于0。
    -

四、深度学习中的正则化,正则化的介绍

  1. 正则化的主要作用在于: 提高泛化能力,防止过拟合。
  2. 常见正则化方法
    参数范数惩罚
    作为约束的范数惩罚
    数据集增强
    提前终止
    Dropout

L2正则化是指权值向量w中各个元素的平方和然后再求平方根,其目的是使权重更加接近原点1。在其他学术圈, L2 也被称为岭回归或 Tikhonov 正则。
L2正则化能让学习算法 ‘‘感知’’ 到具有较高方差的输入 x,因此与输出目标的协方差较小(相对增加方差)的特征的权重将会收缩。

L1正则化和L2之间区别很小,是指权值向量w中各个元素的绝对值之和。
L1正则化导出的稀疏性质已经被广泛地用于特征选择(feature selection)机制。

深度模型中的优化:参数初始化策略;自适应学习率算法;batch norm层;layer norm层。

  1. 深度模型中的优化算法:
    1)随机梯度下降(SGD)
    2)使用动量(momentum)的随机梯度下降(SGD)
    3)使用Nesterov动量的随机梯度下降(SGD)
  2. 参数初始化策略:
    Gaussian initialization
    Xavier initialization
    He initialization
    Batch Normlization
  3. 自适应学习率算法:
    1)AdaGrad
    2)RMSProp
    3)RMSProp 算法: 修改AdaGrad 以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。
    4)Adam

详细介绍请参考https://blog.csdn.net/justpsss/article/details/77680174

  1. batch norm层
    batch normalization的原理:BN主要原理是使得每一层的输出的分布相同,从而让网络的每一层不必再因为需要学习数据分布上的不同而受到影响。BN的好处包括允许网络使用较高的学习率,能够起到一定的regularization的作用等等,从而加速训练。
  2. layer norm层
    注意到一层输出的改变会产生下一层输入的高相关性改变,特别是当使用 ReLU,其输出改变很大。那么我们可以通过固定一层神经元的输入均值和方差来降低 covariate shift 的影响。

参考资料

  1. 深度学习之正则化系列(1):深入理解参数范数惩罚(L1正则化、L2正则化)原理及tensorflow实现 https://blog.csdn.net/gsww404/article/details/80414675
  2. 深度模型中的优化算法 https://blog.csdn.net/justpsss/article/details/77680174
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值