type
status
date
slug
summary
tags
category
icon
password
Property
节省内存
运行一些操作可能会导致为新结果分配内存。 例如,如果用
Y = X + Y
,将取消引用Y
指向的张量,而是指向新分配的内存处的张量:这是不可取的,机器学习可能有数百兆的参数,并且一秒内多次更新所有参数。 通常情况下,最好原地执行这些更新。如果不原地更新,其他引用仍然会指向旧的内存位置,这样某些代码可能会无意中引用旧的参数。
执行原地操作非常简单,可以用切片表示法将操作的结果分配给先前分配的数组,例如
Y[:] = <expression>
。 下面创建一个新的矩阵Z
,其形状与另一个Y
相同, 使用zeros_like
来分配一个全0的块如果在后续计算中没有重复使用
X
, 也可以使用X[:] = X + Y
或X += Y
来减少操作的内存开销type
status
date
slug
summary
tags
category
icon
password
Property
目录
命令式编程
命令式编程使用诸如
print
、“+
”和if
之类的语句来更改程序的状态,考虑下面这段简单的命令式程序:Python是一种解释型语言(interpreted language)。因此,当对上面的
fancy_func
函数求值时,它按顺序执行函数体的操作。也就是说,它将通过对e = add(a, b)
求值,并将结果存储为变量e
,从而更改程序的状态。接下来的两个语句f = add(c, d)
和g = add(e, f)
也将执行类似地操作,即执行加法计算并将结果存储为变量。尽管命令式编程很方便,但可能效率不高。一方面原因,
Python
会单独执行这三个函数的调用,而没有考虑add
函数在fancy_func
中被重复调用。如果在一个GPU(甚至多个GPU)上执行这些命令,那么Python
解释器产生的开销可能会非常大。此外,它需要保存e
和f
的变量值,直到fancy_func
中的所有语句都执行完毕。这是因为程序不知道在执行语句e = add(a, b)
和f = add(c, d)
之后,其他部分是否会使用变量e
和f
。符号式编程
考虑另一种选择符号式编程(symbolic programming),即代码通常只在完全定义了过程之后才执行计算。这个策略被多个深度学习框架使用,包括
Theano
和TensorFlow
(后者已经获得了命令式编程的扩展)。一般包括以下步骤:type
status
date
slug
summary
tags
category
icon
password
Property
目录
很多的 loss 函数都有
size_average
和 reduce
两个布尔类型的参数。因为一般损失函数都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 (batch_size, ) 的向量。- 如果
reduce = False
,那么 size_average 参数失效,直接返回向量形式的 loss;
- 如果
reduce = True
,那么 loss 返回的是标量
Pytorch最新的版本将弃用这两参数改用reduction:
- weight:(张量,可选)可以指定一个一维的Tensor,用来设置每个类别的权重。用C表示类别的个数,Tensor的长度应该为C。当训练集不平衡时该参数十分有用。
- size_average:(最新的版本已弃用) 默认为True,此时损失是每个minibatch的平均;如果设成False,则对每个minibatch求和。这个属性只有当reduce参数设置成True时才生效。
- reduce:(最新的版本已弃用) 默认为True,此时损失为根据size_average参数的值计算每个minibatch的和或者是平均;如果设置成False,忽略size_average参数的值,并返回每个元素的损失。
🐠
type
status
date
slug
summary
tags
category
icon
password
Property
目录
深度学习的优化目标
尽管优化提供了一种最大限度地减少损失函数的方法,但实质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。
例如,训练误差和泛化误差通常不同,由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。但是,深度学习的目标是减少泛化误差,除了使用优化算法来减少训练误差之外,还需要注意过拟合。
如下图所示所述,经验风险是训练数据集的平均损失,而风险则是整个数据群的预期损失。假设只有有限量的训练数据,经验风险函数不如风险函数平滑。
经验风险、期望风险、结构风险
经验风险:基于样本学习的经验进行决策的错误风险。将经验风险最小化,将会使模型对训练样本的学习能力增强,表现为拟合能力增强。显然,一味的经验风险最小化,会使得模型对训练样本过拟合。
期望风险:所谓期望,是对所有可能输入的分布的预测,假定输入的分布服从。则在此分布基础上进行样本训练时,每个样本在总体中的概率是已知的,故对每个训练样本进行决策时,其原来的经验风险可以重新描述为期望风险。由于考虑到了样本在总体中的分布(先验),此时的损失函数更为准确。然而,这种先验知识往往不会事先得到(虽然可以凭借经验进行预测,但始终不是总体的真是分布),因此期望风险是乌托邦。
🐠
type
status
date
slug
summary
tags
category
icon
password
Property
目录
选择“恰到好处”的学习率 是很棘手的。 如果把它选得太小,就没有什么进展;如果太大,得到的解就会振荡,甚至可能发散。 如果可以自动确定,或者完全不必选择学习率,会怎么样?
除了考虑目标函数的值和梯度、还考虑它的曲率的二阶方法可以帮我们解决这个问题。 虽然由于计算代价的原因,这些方法不能直接应用于深度学习,但为如何设计高级优化算法提供了有用的思维直觉,可以模拟许多理想特性。
牛顿法
回顾一些函数 的泰勒展开式,事实上可以把它写成
为了避免繁琐的符号,将 定义为的Hessian,是矩阵。
当的值很小且问题很简单时, 很容易计算。 但对于深度神经网络,考虑到可能非常大,个条目的存储代价会很高, 此外通过反向传播进行计算可能雪上加霜。