About This Book
机器学习借鉴了多个数学分支,不幸的是真实的世界并不觉得有任务义务按数学行事。即使用了最好的数学模型,你仍然有可能以糟糕的结果告终。TensorFlow并非要给你分析一个系统的理想模型,而是帮你减少机器学习开发花费的时间和遇到的挫折。
Understanding Machine Learning
机器学习通过发现大量数据中的模式,处理邮件分类、路线规划、商品推荐等不确定事件。
The Development of Machine Learning
统计回归仍然在机器学习中扮演重要角色。最新的突破是在神经网络获得的。神经网络是对大脑的逆向工程,曾经因为计算能力和编程技术(缺乏框架,类库)的限制,机器学习的理论相对成熟而应用较少。随着大量数据的累积,计算能力和技术的进步,机器学习开始流行。
Machine Learning Frameworks
机器学习框架常起步于数值计算类库或工具集,目前流行的有5个:
> TORCH 第一个机器学习框架,使用Lua作为接口语言限制了其推广;
> THEANO 因其高性能和支持自动微分,开发多用其作为数值计算工具;
> CAFFE 用C++实现支持GPU加速,受学术和企业届欢迎;
> KERAS 更强调开发的便利性,可作为其它框架的接口;
> TENSORFLOW 兼具高性能和开发便利性。
Exploring the TensorFlow Installation
安装TensorFlow以后,常用的Python包有:
> tensorflow 框架的中心包,常引入为tf
> tf.train 和训练相关的优化器和其它类
> tf.nn 神经网络类和相关的数学操作
> tf.layers 多层神经网络相关的函数
Setting the Style
Google推荐的编码规范:https://www.tensorflow.org/community/style_guide
Python官方的编码规范:https://www.python.org/dev/peps/pep-0008/
Tensor可以理解为多维数组。
Creating Tensors
在TensorFlow中为类Tensor的实例。Tensor可以包含数值(默认float32, int32等)、布尔或字符串类型元素,一个Tensor只能含有一种类型。不同于通常的类实例,Tensor需通过API创建,变换或者操作。
Creating Tensors with Known Values
常用tf.constant(array),还有tf.zeros, tf.ones, tf.fill, tf.linespace, tf.range等函数可用。
Creating Tensors with Random Values
使用tf.random_normal(shape)等。
Transforming Tensors
使用tf.reshape(tensor, shape),tf.reverse(tensor, axis)等。
tf.reverse(tf.constant([1, 2, 3], [4, 5, 6]]), [0])结果为[[4, 5, 6], [1, 2, 3]]
Creating Operations
调用操作函数时并不马上执行,而是加入到当前的图中,待session执行图时执行,因此称作Creating Operations。
基本数学操作(shape相同,按元素操作):tf.add, tf.multiply等
取整,比较操作:tf.round, tf.maximum等
向量和矩阵操作:tf.tensordot, tf.matmul等
创建操作时加入图而不马上执行,原因是图可导出到文件或者在远程系统加载。
Forming Graphs
用tf.get_default_graph()获得当前的图。
用 with tf.Graph().as_default(): 创建并切换到新的图。
用tf.train.write_graph将图写入文件。
Creating and Running Sessions
常用 with tf.Session() as sess: 创建一个新Session。
用sess.run(fetches, feed_dict=None, options=None, run_metadata=None)执行Session,通常返回和fetches形状相同的narray。也可使用res1, res2 = sess.run([t1, t2])同时执行两个Tensor并返回。
Writing Messages to the Log
可使用tf.logging.info()等函数输出分级别的日志。
Visualizing Data with TensorBoard
使用tf.summary包中的函数创建并输出sacalar, histogram等图形,可在TensorBoard中显示图形。执行tensorboard --logdir=outpu启动。
Training in TensorFlow
训练流程包括4步:
1. 构建一个模型的数学表达式,包括输入输出和训练中被更新的变量;
2. 定义一个测量模型输出和实际值之间差异的误差表达式,使用误差表达式创建一个Optimizer,并调用其minimize方法;
3. 配置提供训练数据的feed_dict;
4. 调用session的run方法,执行训练。
Formulating the Model
本书中一类是回归模型,一类是神经网络模型。
Tensorflow中,可训练的参数是Variable类的实例。
Looking at Variables
Variable与Tensor相似,都可以表示为多维数组,但Variable仅用于存储训练中被更新的数据。需用不同的API创建。使用tf.Variable(_aTensor)创建Variable。需创建一个初始化操作,并在session中执行。常用tf.global_variables_initializer()。
Determining Loss
TensorFlow中文档中loss是机器学习文献中常出现的cost。Mean squired error是一种计算表达式模型loss的常用方法:sum((yo-y)^2)/N。神经网络模型不能以简单的等式计算loss。
Minimizing Loss with Optimization
优化器(Optimizer)的minimize(loss)方法,返回一个可以被sess.run()执行的operation。训练的过程即多轮执行优化器的最小化操作。
梯度下降法(GradientDescentOptimizer):函数的梯度是一个vector,元素为函数在各维度上的偏微分。梯度的方向可以理解为向高点最陡峭的方向,而梯度的反方向为向低点最陡峭的方向。梯度下降法沿着梯度的反方向移动,以求解最小值。优点是一个古老,简单,易于理解的算法。缺点为,可能找到了局部最小值;通常缓慢收敛到最小值;仅可用于可微分的函数;可能因learning rate选择不当而振荡无法到达最小值。
除了梯度下降法,还有MomentumOptimizer, AdagradOptimizer, AdamOptimizer等优化器。
Feeding Data into a Session
使用tf.placeholder(dtype, shape=None, name=None)创建一个占位符;在模型和损失函数中使用占位符;在sess.run中使用feed_dict向占位符喂数。
Saving and Restoring Variables
使用tf.train.Saver保存参数。取回参数分为两步:使用1) saver = tf.train.import_meta_graph加载到当前graph,使用restore访问变量。
Working with SavedModels
作为Saver的替代,可以创建一个SavedModel存储应用的整个模型。
Session Hooks
可以实现一些回调函数,当某一事件发生时执行,如after_create_session, before_run, after_run等。
Tensor | 张量。tensor可以理解为多维数组,0维张量为scalar 标量,1维张量为vector 矢量,2维张量为matrix 矩阵。在TensorFlow中: > tensor是Tensor类的实例 > tensor的元素可以为数值、字符串或布尔值,但一个tensor内的所有元素需类型一致 > tensor的创建、转换和操作需使用tensorflow中的函数来执行 |
TensorFlow | Google提供的用于开发机器学习应用的框架 |
Transforming | tensorflow包中提供的一类函数,用于在tensor创建后,更新tensor的形状,如reshape |
Operation | 可理解为tensorflow包中提供的对tensor做操作的函数,如初始化、数学运算。操作本身只定义执行,要执行操作,需放在sess.run()的fetches参数中 |
Graph | tensorflow的函数(creates, transforms, processes),并不执行操作,而是将操作增加到一个数据结构,即图中。当session执行图时,操作才真正被执行。图的优点在于可以导出为文件,或者加载到远程系统。graph无需显式创建,可通过tf.get_default_graph()获取到默认 |
TensorBoard | 在网页中图形化显示tensorflow应用数据的实用程序。 |
summary data | TensorBoard所需的特殊结构的数据。 |
summary operation | tf.summary中的一类Operation,用于给TensorBorard供summary data,执行时将相关数据写入缓冲区。例如scalar, histogram。 |
Variable | 与tensor类似,以多维数组存储数据,可被Operations操作。用于存储训练中被更新的数据(变量)。变量是Variable类的实例,需在session执行前初始化。 |
Loss | 机器学习文献中常称为cost function, 可理解为模型输出和实测值(observed value)间的差。 |
Optimization | 更新模型中的变量,以最小化loss的过程。tf.train中提供了多种优化算法,选择适当的算法可以优化应用的性能。 |
Gradient Descent Optimizer | 函数的梯度是一个vector,元素为函数在各维度上的偏微分。梯度的方向可以理解为向高点最陡峭的方向,而梯度的反方向为向低点最陡峭的方向。梯度下降法沿着梯度的反方向移动,以求解最低点(最小值) |
Momentum Optimizer |
动量优化是在梯度下降基础之上的改进,之前的优化结果影响未来的优化,以更快的趋近极小值。这种影响通常是“衰减”的,使用因子0.9。 |
Adagrad Optimizer | Gradient descent和momentum算法都有一个缺点:在每个被训练变量上使用了相同的learning rate,但不同的变量可能以不同的速率收敛。Adagrad = Adaptive Subgradient, 此法通过自适应梯度优化改进了这点。 |
Adam Optimizer | Adam = Adaptive Moment Estimation,与Adagrad和Momentum算法都相似的算法。 |
Placeholder | 占位符。一个placeholder是一个常量tensor,持有session中用于喂数的一批数据。使用tf.placeholder创建placeholder时需指定类型,可指定形状。 |
stochasticity | 随机性。为了能找到全局最小值,随机性算法将数据分为若干个小batch,将其随机喂给sess。 |
SGD | =Stochastic gradient descent,随机梯度下降算法 |