为了提供一个统一的接口,我在 GitHub 上维护了一个通用 API:atom。可以使用 pip
安装。本仓库借鉴了 d2l 和 简单粗暴 TensorFlow 2。
首先导入一些库:
from xint import utils
from xint import mxnet as xint
np = xint.np
from xint import utils
from xint import tensorflow as xint
np = xint.np
from xint import utils
from xint import torch as xint
np = xint.np
简单的使用 atom
由于 np
已经绑定了各自的深度学习环境,且三种框架及其相似,所以,下文如果框架之间没有分歧,统一使用没有指示环境的模式,比如:
n = 10000
a = np.ones(n)
b = np.zeros(n)
你可以分别查看各自环境的数据:
a
a
a
可以看到不同环境表示的不同的 np
,可以无缝的使用它。
atom
定义了一个计时器 Timer
,下面测试矢量化的好处。
- 使用
for
循环:
c = np.zeros(n)
timer = utils.Timer()
for i in range(n):
c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
import tensorflow as tf
c = tf.Variable(tf.zeros(n))
timer = utils.Timer()
for i in range(n):
c[i].assign(a[i] + b[i])
f'{timer.stop():.5f} sec'
c = np.zeros(n)
timer = utils.Timer()
for i in range(n):
c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
- 使用重载的
+
运算符来计算按张量的和。
timer.start()
d = a + b
f'{timer.stop():.9f} sec'
输出的时间有点差异,但是都很快:
可以看出矢量化对运算速度的提升是数量级的。
正态分布与平方损失
正态分布(normal distribution),也被称为 高斯分布(Gaussian distribution),最早由德国数学家高斯(Gauss)应用于天文学研究。简单的说,若随机变量 $x$ 具有均值 $\mu$ 和方差 $\sigma^2$(标准差 $\sigma$),其正态分布概率密度函数如下:
使用 np
可以实现:
def normal(x, mu, sigma):
p = 1 / np.sqrt(2 * np.pi * sigma**2)
return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)
可视化正态分布:
x = np.arange(-7, 7, 0.01)
# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
utils.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',
ylabel='p(x)', figsize=(4.5, 2.5),
legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])
改变均值会产生沿 $x$ 轴的偏移,增加方差将会分散分布、降低其峰值。
利用均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是:假设观测 $\mathbf{x}$ 中包含噪声,其中噪声服从正态分布。噪声正态分布如下式:
因此,我们现在可以写出通过给定的观测 $\mathbf{x}$ 到特定 $y$ 的似然(likelihood):
根据最大似然估计法,参数 $\mathbf{w}$ 和 $b$ 的最优值是使整个数据集的似然最大的值:
根据最大似然估计法选择的估计量称为最大似然估计量 。为了更好的计算,可以最小化负对数似然 $-\log P(\mathbf y \mid \mathbf X)$。由此可以得到的数学公式是:
现在我们只需要假设 $\sigma$ 是某个固定常数就可以忽略第一项,因为第一项不依赖于 $\mathbf{w}$ 和 $b$。现在第二项除了常数 $\frac{1}{\sigma^2}$ 外,其余部分和前面介绍的平方误差损失是一样的。因此,在高斯噪声的假设下,最小化均方误差等价于对线性模型的最大似然估计。