动手深度学习v2
引言
机器学习中的关键组件
无论什么类型的机器学习,都需要以下组件:
- 学习的数据
- 转换数据的模型
- 目标函数,量化模型的有效性
- 调整模型参数以优化目标函数的算法
数据
大多时候遵循独立同分布(指随机过程中,任何时刻的取值都为随机变量,这些随机变量服从同一分布,并且互相独立)
目标函数
通常定义一个目标函数,并希望优化它到最低点。 因为越低越好,所以这些函数有时被称为损失函数(loss function)
优化算法
一种算法,它能够搜索出最佳参数,以最小化损失函数。 深度学习中,大多流行的优化算法通常基于一种基本方法–梯度下降(gradient descent)。
各种机器学习问题
监督学习
监督学习(supervised learning)擅长在“给定输入特征”的情况下预测标签。 每个“特征-标签”对都称为一个样本(example)。
- 回归:当标签取任意数值时,我们称之为回归问题
- 分类:多标签分类
- 搜索:在信息检索领域,我们希望对一组项目进行排序。 首先为集合中的每个元素分配相应的相关性分数,然后检索评级最高的元素。
- 推荐系统:目标是向特定用户进行“个性化”推荐。
- 序列学习:要求模型需要拥有记忆功能。输入和输出都是可变长度的序列,例如机器翻译和从语音中转录文本。
无监督学习
数据中不含有“目标”的机器学习问题通常被为无监督学习(unsupervised learning)
- 聚类(clustering)问题:没有标签的情况下,我们是否能给数据分类呢?
- 主成分分析(principal component analysis)问题:我们能否找到少量的参数来准确地捕捉数据的线性相关属性?
- 因果关系(causality)和概率图模型(probabilistic graphical models)问题:我们能否描述观察到的许多数据的根本原因?例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系?
- 生成对抗性网络(generative adversarial networks)
强化学习:与环境互动
无论是有监督学习还是无监督学习,都会预先获取大量的数据。然后启动模型,不再与环境交互,称为“离线学习”。
强化学习(reinforcement learning)
在强化学习问题中,智能体(agent)在一系列的时间步骤上与环境交互。 在每个特定时间点,智能体从环境接收一些观察(observation),并且必须选择一个动作(action),然后通过某种机制(有时称为执行器)将其传输回环境,最后智能体从环境中获得奖励(reward)。 此后新一轮循环开始,智能体接收后续观察,并选择后续操作,依此类推。
强化学习的目标是产生一个好的策略(policy)。 强化学习智能体选择的“动作”受策略控制,即一个从环境观察映射到行动的功能。
预备知识
数据操作
节省内存
运行一些操作可能会导致为新结果分配内存。 例如,如果我们用Y = X + Y
,我们将取消引用Y
指向的张量,而是指向新分配的内存处的张量。
我们一般不希望这样,因为:
- 我们不想总是不必要地分配内存,希望原地执行更新。
- 如果不原地更新,代码有可能会引用旧的参数。
如果进行原地操作:
使用切片:Y[:]=<expression>
需要注意的是:如果操作涉及到了改变矩阵的维度,就不能使用此方法。
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
输出:
id(Z): 139931132035296
id(Z): 139931132035296
如果在后续计算中没有重复使用X
, 我们也可以使用X[:] = X + Y
或X += Y
来减少操作的内存开销。
转换为其他对象
torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
import numpy
import torch
X = torch.ones(2,2)
Y = X.numpy()
Y[0][0] = 2
print(X)
print(Y)