讀書筆記

1. 機器學習透過預設的操作方法集尋找適合的資料表示法

  • 机器学习算法在寻找这些变换时通常没有什么 创造性,而仅仅是遍历一组预先定义好的操作,这组操作叫作假设空间(hypothesis space)。

2. 深度學習透過資料變換,實現將輸入映射到目標這件事,而資料變換的方法是通過觀察例子學習到的

  • 机器学习是将输入(比如图像)映射到目标(比如标签“猫”),这一过程是通过观察许多输入和目标的示例来完成的。你还知道,深度神经网络通过一系列简单的数据变换(层)来实现这种输入到目标的映射,而这些数据变换都是通过观察示例学习到的。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

3. 損失函數用來計算預測和真實數值的距離,以衡量網路效果

  • 神经网络损失函数(loss function)的任务,该函数也叫目标函数(objective function)。损失函数的输入是网络预测值与真实目标值(即你希望网络输出的结果),然后计算一个距离值,衡量该网络在这个示例上的效果好坏
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

4. 損失函數(距離)=回饋訊號,用來微調權重

  • 深度学习的基本技巧是利用这个距离值作为反馈信号来对权重值进行微调,以降低当前示例对应的损失值

5. Optimizer利用反向傳播演算法來微調權重

  • 这种调节由优化器(optimizer)来完成,它实现了所谓的反向传播(backpropagation)算法,这是深度学习的核心算法。下一章中会详细地解释反向传播的工作原理。
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

6. 資料透過神經網路每一層資料過濾器,能提取出重要資訊

  • 神经网络的核心组件是层(layer),它是一种数据处理模块,你可以将它看成数据过滤器。进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示——我们期望这种表示有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的数据过滤器(即层)

7. 資料前處理需要先縮放到[0, 1]之間

  • 在开始训练之前,我们将对数据进行预处理,将其变换为网络要求的形状,并缩放到所有值都在 [0, 1] 区间。比如,之前训练图像保存在一个 uint8 类型的数组中,其形状为(60000, 28, 28),取值区间为 [0, 255]。我们需要将其变换为一个 float32 数组,其形状为 (60000, 28 * 28),取值范围为 0~1

8. 張量是任意維度的數字容器

  • 张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广[注意,张量的维度(dimension)通常叫作轴(axis)]

9. 深度學習中資料張量的第0軸都是樣本軸或樣本維度(sample axis)

0. 資料批量處理時第0軸會稱作批量軸(batch axis)或批量維度(batch dimension)

11. 二維向量數據包含樣本軸和特徵軸

  • 人口统计数据集,其中包括每个人的年龄、邮编和收入。每个人可以表示为包含 3 个值的向量,而整个数据集包含 100 000 个人,因此可以存储在形状为 (100000, 3) 的 2D张量中
  • 文本文档数据集,我们将每个文档表示为每个单词在其中出现的次数(字典中包含20 000 个常见单词)。每个文档可以被编码为包含 20 000 个值的向量(每个值对应于字典中每个单词的出现次数),整个数据集包含 500 个文档,因此可以存储在形状为(500, 20000) 的张量中。

12. 三維序列數據包含(樣本軸, 時間軸, 特徵軸)

  • 股票价格数据集。每一分钟,我们将股票的当前价格、前一分钟的最高价格和前一分钟的最低价格保存下来。因此每分钟被编码为一个 3D 向量,整个交易日被编码为一个形状为 (390, 3) 的 2D 张量(一个交易日有 390 分钟),而 250 天的数据则可以保存在一个形状为 (250, 390, 3) 的 3D 张量中。这里每个样本是一天的股票数据。
  1. 四維圖像數據包含(樣本軸, 高度, 寬度, 顏色深度)
  • 图像张量的形状有两种约定:通道在后(channels-last)的约定(在 TensorFlow 中使用)和通道在前(channels-first)的约定(在 Theano 中使用)。

14. 五維影片數據包含(樣本軸, frames, 高度, 寬度, 顏色深度)

  • 一个以每秒 4 帧采样的 60 秒 YouTube 视频片段,视频尺寸为 144×256,这个视频共有 240 帧。4 个这样的视频片段组成的批量将保存在形状为 (4, 240, 144, 256, 3)的张量中。总共有 106 168 320 个值!

15. Numpy內建張量運算函數由C或Fortran編寫的基礎線性代數子程式(BLAS, Basic Linear Algebra subprogram)執行

  • 在实践中处理 Numpy 数组时,这些运算都是优化好的 Numpy 内置函数,这些函数将大量运算交给安装好的基础线性代数子程序(BLAS,basic linear algebra subprograms)实现(没装的话,应该装一个)。BLAS 是低层次的、高度并行的、高效的张量操作程序,通常用 Fortran或 C 语言来实现。

16. 張量點積(tensor product)將張量與權值張量對應元素相乘再相加,概念類似矩陣乘積,與逐元素乘積不同

  • z = np.dot(x,y) //numpy或keras
  • z = x.y
  • 两个向量之间的点积是一个标量,而且只有元素个数相同的向量之间才能做点积。
  • 可以对一个矩阵 x 和一个向量 y 做点积,返回值是一个向量
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →
  1. 神經網路是透過一系列張量運算組成而張量運算是輸入數據的幾何變換。
  • 前面讲过,神经网络完全由一系列张量运算组成,而这些张量运算都只是输入数据的几何变换。因此,你可以将神经网络解释为高维空间中非常复杂的几何变换,这种变换可以通过许多简单的步骤来实现。
  1. 機器學習試圖替複雜且高度摺疊的數據流行找到簡潔的表示方式

  2. 深度學習用多層較簡單的變換取代機器學習複雜的幾何變換

  • 让纸球恢复平整就是机器学习的内容:为复杂的、高度折叠的数据流形找到简洁的表示。现在你应该能够很好地理解,为什么深度学习特别擅长这一点:它将复杂的几何变换逐步分解为一长串基本的几何变换,这与人类展开纸球所采取的策略大致相同。深度网络的每一层都通过变换使数据解开一点点——许多层堆叠在一起,可以实现非常复杂的解开过程
  1. 損失函數可以看作將權重映射到損失值的函數
  • y_pred = dot(W, x); loss_value = loss(y_pred, y)
  • 如果输入数据 x 和 y 保持不变,那么这可以看作将 W 映射到损失值的函数。
  • loss_value = f(W)
  1. 可微函數理論上可以用解析法求最小值,但實際上因為參數太多而無法求解
  • 给定一个可微函数,理论上可以用解析法找到它的最小值:函数的最小值是导数为 0 的点,因此你只需找到所有导数为 0 的点,然后计算函数在其中哪个点具有最小值
  • N=2 或 N=3 时可以对这样的方程求解,但对于实际的神经网络是无法求解的,因为参数的个数不会少于几千个,而且经常有上千万个。
  1. 小批量随机梯度下降(SGD, mini-batch stochastic gradient descent)資料透過隨機抽取訓練樣本x和對應目標y組成
  • (1) 抽取训练样本 x 和对应目标 y 组成的数据批量。
  • (2) 在 x 上运行网络,得到预测值 y_pred。
  • (3) 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。
  • (4) 计算损失相对于网络参数的梯度[一次反向传播(backward pass)]。
  • (5) 将参数沿着梯度的反方向移动一点,比如 W -= step * gradient,从而使这批数据上的损失减小一点
  1. Learning rate太小會造成迭代次數過多或者陷入局部極小點
  • 直观上来看,为 step 因子选取合适的值是很重要的。如果取值太小,则沿着曲线的下降需要很多次迭代,而且可能会陷入局部极小点。如果取值太大,则更新权重值之后可能会出现在曲线上完全随机的位置。
  1. 動量解決SGD收斂速度慢和局部極小點的問題

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  2. 引入動量需要考慮當前的斜率和當前的速度

  • 有一种有用的思维图像,就是将优化过程想象成一个小球从损失函数曲线上滚下来。如果小球的动量足够大,那么它不会卡在峡谷里,最终会到达全局最小点。动量方法的实现过程是每一步都移动小球,不仅要考虑当前的斜率值(当前的加速度),还要考虑当前的速度(来自于之前的加速度)。这在实践中的是指,更新参数 w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新,其简单实现如下所示
  1. 網路每層都對資料作一些簡單運算,這些運算包含代表該層屬性的權重張量
  • 这个网络包含两个 Dense 层,每层都对输入数据进行一些简单的张量运算,这些运算都包含权重张量。权重张量是该层的属性,里面保存了网络所学到的知识(knowledge)
  1. 每經過一個epoch代表對所有訓練資料迭代一次
  • 网络开始在训练数据上进行迭代(每个小批量包含128 个样本),共迭代 5 次[在所有训练数据上迭代一次叫作一个轮次(epoch)]。在每次迭代过程中,网络会计算批量损失相对于权重的梯度,并相应地更新权重。5 轮之后,网络进行了2345 次梯度更新(每轮 469 次),网络损失值将变得足够小,使得网络能够以很高的精度对手写数字进行分类
  1. 學習是指找到一組模型參數,使得在給定的訓練資料樣本和對應目標上的損失函數最小化

  2. Optimizer是使用損失梯度更新參數的方式

  3. 權重是層的狀態,包含網路的知識

  • 神经网络的基本数据结构是层。层是一个数据处理模块,将一个或多个输入张量转换为一个或多个输出张量。有些层是无状态的,但大多数的层是有状态的,即层的权重。权重是利用随机梯度下降学到的一个或多个张量,其中包含网络的知识
  1. 2D向量數據通常用密集連接層(densely connected layer)處理

  2. 密集連接層(densely connected layer)又稱全連接層(fully connected layer)或密集層(dense layer)

  3. 3D張量(序列數據)通常用循環層(recurrent layer),例如Keras的LSTM層處理

  4. 4D張量(圖像數據)通常用二維卷積層Conv2D處理

  5. 簡單深度學習模型是層構成的有向無環圖

  • 深度学习模型是层构成的有向无环图。最常见的例子就是层的线性堆叠,将单一输入映射为单一输出
  1. 複雜深度學習模型包含網路拓樸結構。例如Two-branch Net, Multihead Net, Inception Net

  2. 網路拓樸結構定義一個假設空間,限定一系列特定的張量運算

  • 网络的拓扑结构定义了一个假设空间(hypothesis space)。你可能还记得第 1 章里机器学习的定义:“在预先定义好的可能性空间中,利用反馈信号的指引来寻找输入数据的有用表示。”选定了网络拓扑结构,意味着将可能性空间(假设空间)限定为一系列特定的张量运算,将输入数据映射为输出数据。然后,你需要为这些张量运算的权重张量找到一组合适的值。
  1. Keras是一個Model-level的library,依賴Tensorflow, Theano, CNTK等後端引擎建構高層次的模塊。
  • Keras 是一个模型级(model-level)的库,为开发深度学习模型提供了高层次的构建模块。它不处理张量操作、求微分等低层次的运算。相反,它依赖于一个专门的、高度优化的张量库来完成这些运算,这个张量库就是 Keras 的后端引擎(backend engine)。Keras 没有选择单个张量库并将 Keras 实现与这个库绑定,而是以模块化的方式处理这个问题(见图 3-3)。因此,几个不同的后端引擎都可以无缝嵌入到 Keras 中。目前,Keras 有三个后端实现:TensorFlow 后端、Theano 后端和微软认知工具包(CNTK,Microsoft cognitive toolkit)后端。未来 Keras 可能会扩展到支持更多的深度学习引擎
  1. 典型Keras工作流程:
    定義訓練數據、定義層組成的網路、配置學習過程、調用fit方法在訓練數據上進行迭代

  2. 定義模型方式:(1)使用Sequential類 (2)使用函數式API

  • 定义模型有两种方法:一种是使用 Sequential 类(仅用于层的线性堆叠,这是目前最常见的网络架构),另一种是函数式 API(functional API,用于层组成的有向无环图,让你可以构建任意形式的架构