第四章:机器学习基础
本章涵盖了
1.分类和回归以外的机器学习形式
2.机器学习模型的正式评估过程
3.为深度学习准备数据
4.特征工程
5.解决过拟合
6.解决机器学习问题的通用工作流程
在第三章的三个实际例子之后,您应该开始熟悉如何使用神经网络来处理分类和回归问题,并且您已经看到了机器学习的核心问题:过拟合。
这一章将把你的一些新直觉形式化到一个坚固的概念框架中,用来解决深度学习的问题。我们将把所有这些概念——模型评估、数据预处理和特性工程,以及处理过拟合——整合到一个详细的七步工作流程中,以处理任何机器学习任务。
4.1 机器学习的四个分支
监督学习: 这是目前为止最常见的情况。它包括,在给定一组示例(通常由人来注释)的情景下,学习将输入数据映射到已知目标(也称为注解(annotations))。到目前为止,你在这本书中遇到的四个例子都是有监督学习的典型例子。一般来说,目前备受关注的深度学习的几乎所有应用都属于这一类,例如光学字符识别(optical character recognition, OCR)、语音识别、图像分类和语言翻译。虽然有监督学习主要由分类和回归组成,但也有更多的外来变体,包括以下(有例子):
分类、回归、序列生成(sequence generation)、语法树预测(syntax tree prediction)、目标预测(object detection)、图像分割(image segmentation)
无监督学习:机器学习的这个分支包括在不借助任何目标的情况下对输入数据进行有趣的转换,以实现数据可视化、数据压缩或数据去噪,或者更好地理解当前数据中的相关性。无监督学习是数据分析的主要内容,在试图解决一个有监督学习的问题之前,它通常是更好地理解数据集的必要步骤。
降维(dimensionality reduction)、聚类(clustering)
自监督学习:这是监督学习的一个特例,但它的不同之处足以让它应该有自己的类别。自主监督学习是一种无需人为标记标签的监督学习——可以把它看作是没有任何人参与的监督学习。这里仍然涉及到标签(因为学习必须受到某些东西的监督),但它们是由输入数据生成的,通常使用启发式算法。
例如,autoencoders是自监督学习的一个众所周知的实例,其中生成的目标是输入,没有修改。同样地,给定过去的帧,试图预测视频中的下一帧,或给定之前的单词,预测文本中的下一个单词,都是自我监督学习的实例(短暂的监督学习(temporally supervised learning),在这种情况下:监督来自未来的输入数据)。请注意,监督学习、自我监督学习和非监督学习之间的区别有时可能是模糊的——这些类别更像是没有固定边界的连续统一体。自我监督学习可以被重新解释为监督学习或非监督学习,这取决于你关注的是学习机制还是它的应用环境。
自编码器(autoencoder)
强化学习:这个机器学习的分支被长期忽视,直到最近在谷歌DeepMind成功地将其应用于学习玩Atari游戏(后来,学习玩围棋到最顶尖水平)之后,它开始受到很多关注。在强化学习中,agent会接收环境的信息,并学会选择能获得最大回报的行为。例如,可以通过强化学习来训练一个神经网络,它“看”电子游戏屏幕并输出游戏动作以最大化它的分数。
目前,强化学习主要是一个研究领域,在游戏之外还没有取得显著的实际成功。然而,随着时间的推移,我们预计强化学习将接管越来越广泛的现实应用领域:自动驾驶汽车、机器人、资源管理、教育等等。这个想法的时机已经到来,或者即将到来。
选择使奖励最大化的行动
相关术语:
样本(sample)或输入(input)
预测(predict)或输出(output)
目标(target)
预测误差(prediction error)
类别(class)
标签(label)
真值(ground-truth)或标注(annotation)
二分类(binary classification)
多分类(multiclass classification)
多标签分类(multilabel classification)
标量回归(scalar regression)
向量回归(vector regression)
小批量(mini-batch)或批量(batch):通常是2的幂次。8~128
4.2 评估机器学习模型
机器学习目的:得到好的泛化(generalize)模型
4.2.1 训练集、验证集和测试集
验证模型时,有可能会发生消息泄露(information leak)
评估方法:
简单的留出验证(hold-out validation)
K折验证(K-fold validation)
带打乱数据的重复K折验证(iterated K-fold validation with shuffling)
4.2.2 评估模型的注意事项
数据代表性(data representativeness):随机打乱数据
时间箭头(the arrow of time):预测与时间相关,不能随机打乱;且确保测试集数据晚于训练集数据
数据冗余(redundancy in your data):确保训练集和数据集没有交集
4.3 数据预处理、特征工程和特征学习
4.3.1 神经网络的数据预处理
预处理目的:使原始数据更适合于神经网络处理,向量化、标准化、处理缺失值和特征处理
向量化:输入和预测值必须是浮点数张量。数据向量化(data vectorization)
值标准化:取值较小,同质化(homogeneous)平均值为0,标准差为1。 x-=x.mean(axis=0) x/=x.std(axis=0)
处理缺失值:缺失值设为0,让网络学到,0意味着缺失值。当测试集有缺失值,而训练集没有时,要手动给训练集加缺失值。
4.3.2 特征工程(feature engineering)
特征工程:将数据输入模型前,利用人对数据的认识,先对数据进行处理。
本质:更简单的方式表述问题,是问题变得简单。
4.4 过拟合与欠拟合
优化(optimization)
泛化(generalization)
4.4.1 减小网络大小
4.4.2 添加权重正则化
奥卡姆剃刀(Occam/s razor)
成本(cost)
L1正则化:系数绝对值
L2正则化:系数平方
惩罚只在训练时有,所以测试误差会小很多。
4.4.3 添加dropout正则化
训练过程中随机把改层输出特征舍弃
dropout比率:通常0.2~0.5
测试时没有单元舍弃,层输出需要按dropout比率缩小。
以下函数,对比添加不同正则项,交叉验证集的损失
# 正则化防止过拟合
from keras import regularizers
from keras import models
from keras import layers
import numpy as np
# 导入数据
from keras.datasets import imdb
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words = 10000)
def vectorize_sequences(sequences,dimension = 10000):
results = np.zeros((len(sequences),dimension))
for i,sequence in enumerate(sequences):
results[i,sequence] = 1
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
# 将标签也进行向量化
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000

最低0.47元/天 解锁文章
1302

被折叠的 条评论
为什么被折叠?



