【lmy8869】TF学习笔记总结记录

深度学习

#1

Diligence is the mother of success!


#2

###Week 1 ###1、机器器学习中,监督学习 or 非监督学习概念区分,应用场景调研?

  • 监督学习:从一个输出已知的观测集合中归纳出知识的过程。主要用于数据的分类和回归。
  • 非监督学习:从一个输出未知的数据集合中发现知识。主要用于数据的聚类和关联分析。 ###2、做机器学习项目,有哪些环节? 参照CRISP-DM流程,大致应该有项目理解,数据准备,模型建立,测试与评估以及应用部署五个环节。 ###3、深度学习,目前有哪些应用领域? 深度学习主要应用在图像识别、语音识别、自然语言处理(情感分析,词向量构建) ###4、数据预处理,需要注意哪些?
  1. 对数据应进行深入理解,选择必要的记录和变量,并进行合理整合

  2. 清洗数据中噪音,消除异常

  3. 合理规范化数据表达与形式

  4. 精简压缩数据维度 ###5、tensorflow运行原理,架构有哪些核心点?

  5. 使用图 (graph) 来表示计算任务

  6. 在被称之为 会话 (Session) 的上下文 (context) 中执行图

  7. 使用 tensor 表示数据

  8. 通过 变量 (Variable) 维护状态

  9. 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据 ###6、学习中的知识点收获记录?

TF入门初步:

import tensorflow as tf

# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])

# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])

# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)

# 启动默认图.
sess = tf.Session()

# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. 
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回矩阵乘法 op 的输出.
#
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
# 
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]

# 任务完成, 关闭会话.
sess.close()
#Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作
with tf.Session() as sess:
result = sess.run([product])
print result

#3

###Week 2 ###1、Back propagation算法原理理解?

Back propagation伪代码算法流程: 输入:训练集D,学习率η 过程:

    1. 随机初始化网络中所有连接权和阈值
    2. repeat
    3. for all (xk, yk)∈D do
    4.       根据当前参数计算当前样本输出y‘(前向传播)
    5.       计算输出总误差
    6.       计算输出层神经元的梯度项(误差逆向回传给隐层神经元参数)
    7.       计算隐层神经元的梯度项(误差逆向回传给输入层神经元参数)
    8.       按给定学习率和所得梯度项更新各层连接权和阈值
    9.    end for
    10. until达到停止条件(误差最小)

输出:连接权与阈值确定 ###2、sigmoid函数、tanh函数和ReLU函数的区别?以及各自的优缺点?对应的tf函数是?

  1. Sigmoid函数又叫做 Logistic 激活函数,它将实数值压缩进0到1的区间内,还可以在预测概率的输出层中使用。该函数将大的负数转换成0,将大的正数转换成1。Sigmoid 函数的三个主要缺陷:1.梯度消失:Sigmoid 函数趋近0和1的时候变化率会变得平坦,也就是说,Sigmoid的梯度趋近于0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近0或1的神经元其梯度趋近于0。这些神经元叫做饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫做梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。2. 不以零为中心:Sigmoid 输出不以零为中心的。3. 计算成本高昂:exp()函数与其他非线性激活函数相比,计算成本高昂。
  2. Tanh 激活函数又叫作双曲正切激活函数。与 Sigmoid 函数类似,Tanh 函数也使用真值,但Tanh函数将其压缩至-1到1的区间内。与Sigmoid不同,Tanh函数的输出以零为中心,因为区间在-1到1之间。你可以将Tanh函数想象成两个Sigmoid 函数放在一起。在实践中,Tanh函数的使用优先性高于Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值。唯一的缺点是:1. Tanh 函数也会有梯度消失的问题,因此在饱和时也会“杀死”梯度。
  3. ReLU修正线性单元函数(rectified linear unit),该函数明显优于前面两个函数,是现在使用最广泛的函数。f(x) = max (0, x),当输入x<0时,输出为0,当x> 0时,输出为x。该激活函数使网络更快速地收敛。它不会饱和,即它可以对抗梯度消失问题,至少在正区域(x> 0时)可以这样,因此神经元至少在一半区域中不会把所有零进行反向传播。由于使用了简单的阈值化(thresholding),ReLU 计算效率很高。但是 ReLU 神经元也存在一些缺点:1. 不以零为中心:和Sigmoid激活函数类似,ReLU 函数的输出不以零为中心。2. 前向传导过程中,如果x < 0,则神经元保持非激活状态,且在后向传导(backward pass)中“杀死”梯度。这样权重无法得到更新,网络无法学习。当x = 0时,该点的梯度未定义,但是这个问题在实现中得到了解决,通过采用左侧或右侧的梯度的方式。
  4. 三者对应的tf函数是,tf.nn.sigmoid(x, name=None),tf.nn.tanh(x, name=None),tf.nn.relu(x, name=None)。 ###3、 softmax和cross entropy原理理解释?
  5. softmax在机器学习中有非常广泛的应用,softmax究竟是什么意思呢?我们知道max,假如说我有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有第二种可能但有的时候我不想这样,因为这样会造成分值小的那个饥饿。所以我希望分值大的那一项经常取到,分值小的那一项也偶尔可以取到,那么我用softmax就可以了现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的,所以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。所以说不是max,而是softmax。softmax定义为该元素的指数,与所有元素指数和的比值。
  6. cross entropy,交叉熵是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。信息熵代表的是随机变量或整个系统的不确定性,熵越大,随机变量或系统的不确定性就越大。根据真实分布,我们能够找到一个最优策略,以最小的代价消除系统的不确定性,而这个代价大小就是信息熵,记住,信息熵衡量了系统的不确定性,而我们要消除这个不确定性,所要付出的最小努力(如编码长度)的大小就是信息熵。交叉熵,其用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。交叉熵可在神经网络中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。softmax计算概率分布a,且0 <= a<= 1。cross-entropy loss用于度量两个概率分布之间的相似性。求概率分布的方式与损失函数之间可以自由搭配,没有必然联系。 ###4、tf.placeholder() 、tf.constant()、tf.Variable() 的区别?
  • tf.Variable():主要是用于训练变量之类的。比如我们经常使用的网络权重,偏置。值得注意的是Variable在声明时必须赋予初始值,使用前必须进行初始化。在训练过程中该值很可能会进行不断的加减操作变化。

  • tf.placeholder():也是用于存储数据,但是主要用于feed_dict的配合,接收输入数据用于训练模型等。placeholder值在训练过程中会不断地被赋予新的值,用于批训练,基本上其值是不会轻易进行加减操作。placeholder是作为一个容器,在声明时,并不需要给定一个初始值,与c++等语言不同,你可以把它看作成在运行时他并不执行,只有在feed_dict出现训练时,在给予值。不过placeholder 在命名时时需要指定类型的。如:xs = tf.placeholder(tf.float32, [None,1], name = "x_input")这里的xs不仅指定了类型,也定义的shape。如果不定义shape,只要是后续代码中一致,那么可以是任意形式的。

  • tf.constant(value, dtype=None, shape = None, name = ’Const’):创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。 如果是一个数,那么这个常亮中所有值的按该数来赋值。 如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。 ###5、举例说明:tf.Graph()概念理解? tensorflow中的计算以图数据流的方式表示,一个图包含一系列表示计算单元的操作对象,以及在图中流动的数据单元以tensor对象表现。可以在程序开始将某图设置为默认图,并返回一个上下文管理器,如果不显式添加一个默认图,系统会自动设置一个全局的默认图。 所设置的默认图,在模块范围内所定义的节点都将默认加入默认图中。 ###6、tf.name_scope()和tf.variable_scope()的理解?7、tf.variable_scope() 和tf.get_variable()的理解? 要理解 name_scope 和 variable_scope, 首先必须明确二者的使用目的。我们都知道,和普通模型相比,神经网络的节点非常多,节点之间的连接(权值矩阵)也非常多。为了方便区分所设置的变量属于哪一个层次,我们引入了 name_scope 和 variable_scope, 二者又分别承担着不同的责任:

  • name_scope: 为了更好地管理变量的命名空间而提出的。

  • variable_scope: 大部分情况下,跟 tf.get_variable() 配合使用,实现变量共享的功能。

tf.name_scope() 并不会对 tf.get_variable() 创建的变量有任何影响。tf.name_scope() 主要是用来管理命名空间的,可以在variable_scope上附加命名层级,这样子让我们的整个模型更加有条理。而 tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 来完成变量共享的功能,tf.get_variable()可以将其命名的变量复用到不同的variable_scope()内。

示例1:

def my_image_filter():
conv1_weights = 
tf.Variable(tf.random_normal([5, 5, 32, 32]), name="conv1_weights")
    conv1_biases = tf.Variable(tf.zeros([32]), name="conv1_biases")
conv2_weights =
  tf.Variable(tf.random_normal([5, 5, 32, 32]), name="conv2_weights")
    conv2_biases = tf.Variable(tf.zeros([32]), name="conv2_biases")
    return None

# First call creates one set of 4 variables.
result1 = my_image_filter()
# Another set of 4 variables is created in the second call.
result2 = my_image_filter()
# 获取所有的可训练变量
vs = tf.trainable_variables()
print 'There are %d train_able_variables in the Graph: ' % len(vs)
for v in vs:
    print v
#未进行变量共享,对变量直接定义后引用两次的结果就是生成了两套权重和偏置值,为了解决这样的问题,就引入了变量共享,以便是对同一套参数进行使用

There are 8 train_able_variables in the Graph: Tensor(“conv1_weights/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“conv1_biases/read:0”, shape=(32,), dtype=float32) Tensor(“conv2_weights/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“conv2_biases/read:0”, shape=(32,), dtype=float32) Tensor(“conv1_weights_1/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“conv1_biases_1/read:0”, shape=(32,), dtype=float32) Tensor(“conv2_weights_1/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“conv2_biases_1/read:0”, shape=(32,), dtype=float32)

示例2:

def conv_relu(kernel_shape, bias_shape):
#tf.get_variable可以接受tf.variable_scope传递过来的域名,并将该变量置于该域内。
#tf.get_variable()会对命名进行检测,如果不存在则新创建,若果重名则冲突报错,而tf.placeholder()、tf.Variable()的命名,如果不对name属性赋值,tensorflow会自动对其进行默认命名,如果对其name属性赋值,则变量名为对应属性,如果出现同名现象,则以属性_1,类似的方式一次向下命名
weights = 
tf.get_variable("weights", kernel_shape, initializer=tf.random_normal_initializer())
    biases = tf.get_variable("biases", bias_shape, initializer=tf.constant_initializer(0.0))
return None

def my_image_filter():
    # 按照下面的方式定义卷积层,非常直观,而且富有层次感。将tf.variable_scope中的域名传递给tf.get_variable。
    with tf.variable_scope("conv1"):
        # Variables created here will be named "conv1/weights", "conv1/biases".
        relu1 = conv_relu([5, 5, 32, 32], [32])
        #使用tensorflow建立的变量会保留在图中,不会像python函数中的普通变量,使用后就废弃
    with tf.variable_scope("conv2"):
        # Variables created here will be named "conv2/weights", "conv2/biases".
        return conv_relu( [5, 5, 32, 32], [32])

with tf.variable_scope("image_filters") as scope:
    # 下面我们两次调用 my_image_filter 函数,但是由于引入了变量共享机制
# 可以看到我们只是创建了一遍网络结构。
    result1 = my_image_filter()
#变量共享,”name of the scope”. reuse.variables(),或者用with tf.variable_scope(scope, reuse = True)
scope.reuse_variables()
result2 = my_image_filter()

# 看看下面,完美地实现了变量共享
vs = tf.trainable_variables()
print 'There are %d train_able_variables in the Graph: ' % len(vs)
for v in vs:
    print v

There are 4 train_able_variables in the Graph: Tensor(“image_filters/conv1/weights/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“image_filters/conv1/biases/read:0”, shape=(32,), dtype=float32) Tensor(“image_filters/conv2/weights/read:0”, shape=(5, 5, 32, 32), dtype=float32) Tensor(“image_filters/conv2/biases/read:0”, shape=(32,), dtype=float32)

示例3:

with tf.name_scope('nsc1'):
    v1 = tf.Variable([1], name='v1')
    with tf.variable_scope('vsc1'):
        v2 = tf.Variable([1], name='v2')
        v3 = tf.get_variable(name='v3', shape=[])
print 'v1.name: ', v1.name
print 'v2.name: ', v2.name
print 'v3.name: ', v3.name

v1.name: nsc1/v1:0 v2.name: nsc1/vsc1/v2:0 v3.name: vsc1/v3:0

with tf.name_scope('nsc1'):
    v4 = tf.Variable([1], name='v4')
print 'v4.name: ', v4.name

v4.name: nsc1_1/v4:0

###8、tf.global_variables_initializer() 什么时候使用? 目前tf.global_variables_initializer() 已替代 tf.initialize_all_variables()。 在使用tf.global_variables_initializer()添加节点用于初始化所有的变量。在你构建完整个模型并在会话中加载模型后,运行这个节点。 ###9、学习中的知识点收获记录?

  1. tensorflow中的属性None,表示可以取任意值。-1表示用通过另一个属性自动计算该属性值。
  2. tf.trainable_variables(), 它能够将我们定义的所有的trainable=True(即可训练变量)的所有变量以一个list的形式返回。tf.placeholder()其trainable==False,tf.Variable()以及tf.get_variable()都是可选trainable属性。

#4

###Week 3 ###1、Batch Normalization原理解释与优点 http://blog.csdn.net/zhikangfu/article/details/53391840 BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致后向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。BatchNorm不仅仅极大提升了训练速度,收敛过程大大加快,还能增加分类效果。一种解释是,这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果。另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。 梯度弥散与梯度爆炸:http://www.cnblogs.com/yangmang/p/7477802.html 白化:http://blog.csdn.net/haoji007/article/details/52790189 ###2、如何理解卷积? https://www.zhihu.com/question/22298352/answer/228543288 卷积是两个变量在某范围内(对两变量进行约束的线或者面等)相乘后求和(离散变量)或者求积分(连续函数)的结果。 ###3、如何理解卷积神经网络(CNN)中的卷积(Convolution Kernel)和池化(Pooling)&有哪些Pooling? http://www.jeyzhang.com/cnn-learning-notes-1.html 卷积层是卷积核在上一级输入层上通过逐一滑动窗口(一般是在x,y方向上的二维滑动)计算而得,卷积核中的每一个参数都相当于传统神经网络中的权值参数,与对应的局部像素相连接,将卷积核的各个参数与对应的局部像素值相乘之和,(通常还要再加上一个偏置参数),得到卷积层上的结果。 通过卷积层获得了图像的特征之后,理论上我们可以直接使用这些特征训练分类器(如softmax),但是这样做将面临巨大的计算量的挑战,而且容易产生过拟合的现象。为了进一步降低网络训练参数及模型的过拟合程度,我们对卷积层进行池化/采样(Pooling)处理。池化/采样的方式通常有以下两种:

  • Max-Pooling: 选择Pooling窗口中的最大值作为采样值;
  • Mean-Pooling: 将Pooling窗口中的所有值相加取平均,以平均值作为采样值。 ###4、Learning Rate的如何选取,它过大/过小会产生什么影响? 学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过SGD求解问题的极小值时,梯度不能太大,也不能太小。太大容易出现超调现象,即在极值点两端不断发散,或是剧烈震荡,总之随着迭代次数增大loss没有减小的趋势;太小会导致无法快速地找到好的下降的方向,随着迭代次数增大loss基本不变。 因此,我们常常用一些退火的方法调整学习率。学习率调整方法基本上有两种:
  1. 基于经验的手动调整。 通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。
  2. 基于策略的调整。 2.1 fixed 、exponential、polynomial 2.2 自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd ###5、机器学习中,有哪些正则化的方法?目的是什么?Dropout的好处是? https://www.cnblogs.com/jianxinzhou/p/4083921.html 正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout。可以有效控制过拟合问题,提高模型泛化能力。 http://blog.csdn.net/u012162613/article/details/44261657
  • L1、L2正则化均是可以起到缩减参数的作用,但L1正则化方法,会让参数更趋向取值为0,从而达到减少参数、稀疏特征的目的,L2正则化方法无法让参数取到0,而是让其缩小接近于0。

  • Dropout可以看做是一种模型平均,所谓模型平均,顾名思义,就是把来自不同模型的估计或者预测通过一定的权重平均起来。在每个批次的训练过程中,我们随机选择忽略隐层节点,所以每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以单做一个“新”的模型;此外,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。这样dropout过程就是一个非常有效的神经网络模型平均方法,通过训练大量的不同的网络,来平均预测概率。不同的模型在不同的训练集上训练(每个批次的训练数据都是随机选择),最后在每个模型用相同的权重来“融合”。 ###6、Covariate Shift 和 Internal Covariate Shift 如何理解? 假设q1(x)是测试集中一个样本点的概率密度,q0(x)是训练集中一个样本点的概率密度。最终我们估计一个条件概率密度p(y|x,θ),它由x和一组参数θ={θ1,θ2…θm}所决定。对于一组参数来说,对应loss(θ)函数评估性能的好坏。综上,当我们找出在q0(x)分布上最优的一组θ’时,能否保证q1(x)上测试时也最好呢?传统机器学习假设训练集和测试集是独立同分布的,即q0(x)=q1(x),所以可以推出最优θ’依然可以保证q1(x)最优。但现实当中这个假设往往不成立,伴随新数据产生,老数据会过时,当q0(x)不再等于q1(x)时,就被称作covariate shift。 Covariate Shift ≠ Internal Covariate Shift,前者是迁移学习问题,后者是一个训练优化问题。只是对各层添加零均值、单位方差的共轭分布,只针对数值,而不针对表征。实际上,如果把表征也“共荣化”,那就反而糟糕了。多层神经网络可以看作是一个迁移学习问题,层与层之间的抽象等级不同,比如学习一只猫,经过多层神经网络抽象后,就可以迁移分裂成多个机器学习问题:学习猫脸、学习猫腿、学习猫身、学习猫爪、学习猫尾。如果normalize之后,这五个部分的表征分布都变一样了,那么Deep Learning不是可以废掉了?所以说,normalize仅仅是数值层面的均衡化,以及表征层面的轻度破坏化。Internal Covariate Shift只针对数值偏移,而Covariate Shift才针对表征偏移。 ###7、如何理解Momentum?weight decay?它们在神经网络训练中的作用是什么? https://zhuanlan.zhihu.com/p/23906526

  • Momentum:来源于牛顿定律,基本思想是为了找到最优加入“惯性”的影响,当误差曲面中存在平坦区域,SGD就可以更快的学习。是用来修改检索方向加快收敛速度的一种简单方法,一般的通过加入之前的梯度来修改更新梯度步长。

  • Weight decay:在实际应用中,为了避免网络的过拟合,必须对价值函数(Cost function)加入一些正则项,减小不重要的参数对最后结果的影响,网络中有用的权重则不会受到weight decay影响。 ###8、如何理解“过拟合 overfitting”? 神经网络训练,如何避免overfitting? 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。 在机器学习算法中,我们常常将原始数据集分为三部分:training data、validation data,testing data。这个validation data是什么?它其实就是用来避免过拟合的,在训练过程中,我们通常用它来确定一些超参数(比如根据validation data上的accuracy来确定early stopping的epoch大小、根据validation data确定learning rate等等)。如果在testing data上直接做这些,那么随着训练的进行,我们的网络实际上就是在一点一点地overfitting我们的testing data,导致最后得到的testing accuracy没有任何参考意义。因此,training data的作用是计算梯度更新权重,validation data如上所述,testing data则给出一个accuracy以判断网络的好坏。 为了防止overfitting,可以用的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay)、dropout。 http://blog.csdn.net/u012162613/article/details/44261657 ###9、各种优化方法(SGD/Momentum/Adagrad/Adam等),对比优缺点? http://blog.csdn.net/u010089444/article/details/76725843 http://blog.csdn.net/luo123n/article/details/48239963 ###10、经典的卷积神经网络(CNN)之LeNet5模型详细解释? http://www.jianshu.com/p/ce609f9b5910 http://blog.csdn.net/lovelyaiq/article/details/78686296


#5

###Week 4 ###1、LSTM、GRU原理解释,tf中对应的函数?

  • LSTM(Long Short-Term Memory)长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM区别于RNN的地方,主要就在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。一个cell当中被放置了三扇门,分别叫做输入门、遗忘门和输出门。一个信息进入LSTM的网络当中,可以根据规则来判断是否有用。只有符合算法认证的信息才会留下,不符的信息则通过遗忘门被遗忘。由此来达到选择记忆和保存长期信息的效果。

代码实现: http://blog.csdn.net/u014595019/article/details/52759104 http://blog.csdn.net/u013082989/article/details/73693392

  • GRU门限循环单元,是LSTM的一个主要变体,它将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态。

代码实现: https://www.v2ex.com/t/341771 ###2、word2vec 和GloVe 原理,各自的异同?

https://www.cnblogs.com/iloveai/p/cs224d-lecture3-note.html

  • word2vec是基于语言生成概率模型而训练出的词的分布式表达。
  • GloVe则是一种基于共现矩阵统计的词向量模型,它是通过对Skip-gram模型能够挖掘出词与词之间线性关系的背后成因进行分析,然后通过在共现矩阵上构造相似的条件,得到的一个基于全局信息的词向量模型。与Skip-gram模型相比,GloVe在充分利用了语料库的全局统计信息的同时,也提高了词向量在大语料上的训练速度(一个共现矩阵的遍历要比整个语料库的遍历容易的多)。作为基于统计的词向量模型,它而与传统的SVD技术相比,SGD(随机梯度下降)的训练也更加简单高效。同时,GloVe得到的词向量更能把握住词与词之间的线性关系。 ###3、word2vec工业界有哪些应用场景?

http://blog.csdn.net/mytestmy/article/details/38612907 http://x-algo.cn/index.php/2016/03/12/281/ ###4、Resnet、GoogleNet 、VGG16 网络结构原理解释? https://www.cnblogs.com/52machinelearning/p/5821591.html ###5、tf实现word2vec http://blog.csdn.net/u014595019/article/details/54093161