1.定义
给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标(标注)。
2.除了分类和回归外,监督学习的其他变体
1.定义
指在没有目标的情况下,寻找输入数据的变换形式。
2.实例
1.定义
指没有人工标注的标签的监督学习,但标签仍然存在,它们是从输入数据中生成的,通常使用启发式算法生成。
2.实例
1.定义
智能体接收有关环境的信息,并学会选择使得某种奖励最大化的行动。
1.三种经典的评估方法
(1)简单的留出验证
num_validation_samples = 10000
np.random.shuffle(data) # 打乱数据
validation_data = data[:num_validation_samples] # 定义验证集
data = data[num_validation_samples:]
training_data = data[:] # 定义训练集
# 在训练数据上训练模型,并在验证数据上评估模型
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)
# 调节模型、重新训练、评估,然后再次调节
# 一旦调节好超参数,通常就在所有非测试数据上从头训练最终模型
model = get_model()
model.train(np.concatenate([training_data, validation_data]))
test_score = model.evaluate(test_data)
(2)K折验证
k = 4
num_validation_samples = len(data) // 4
np.random.shuffle(data)
validation_scores = []
for fold in range(k):
# 选择验证数据分区
validation_data = data[num_validation_samples * fold :
num_validation_samples * (fold + 1)]
# 使用剩余数据作为训练数据
training_data = data[: num_validation_samples * fold] +
data[num_validation_samples * (fold + 1) :]
# 创建一个全新模型
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)
validation_scores.append(validation_score)
# 最终验证分数:K折验证分数的平均值
validation_score = np.average(validation_scores)
# 在所有非测试数据上训练最终模型
model = get_model()
model.train(data)
test_score = model.evaluate(test_data)
(3)带有打乱数据的重复K折验证
1.向量化
神经网络的所有输入和目标都必须是浮点数张量(特定情况下可以是整数张量)。无论处理什么数据,都必须先将其转换为张量,这一步骤叫做数据向量化。
2.值标准化
(1)输入数据应该具有以下特征
(2)标准化方法
将每个特征分别标准化,使其平均值为0、标准差为1。
x -= x.mean(axis=0)
x /= x.std(axis=0)
3.处理缺失值
一般而言,对于神经网络,将缺失值设为0是安全的。
如果测试数据中存在缺失值,而网络是在没有缺失值的数据上训练的,那么网络不可能学会忽略缺失值。在这种情况下,应该人为生成一些有缺失项的训练样本:多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征。
定义:指在将数据输入模型之前,利用你自己关于数据和机器学习算法的知识对数据进行硬编码的转换,以改善模型效果。其实就是用更简单的方式表述问题,从而进行简化。
为了避免过拟合,最好的解决方法是获取更多的训练数据。
但是如果没办法获取更多数据,次优的解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。这种方法叫做正则化,接下来介绍几种常见的正则化方法。
1.定义
减少模型大小,即减少模型中可学习参数的个数(由层数和每层的单元个数决定),这也叫做模型容量。
2.合理性
如果网络的记忆资源有限,就很难学会输入数据和目标之间的映射,因此,为了让损失最小化,网络必须学会对目标具有很强预测能力的压缩表示。
3.一般的工作流程
在验证集上评估一系列不同的网络架构,开始选择相对较少的层和参数,然后逐渐增加层的大小或增加新层,直到这种增加对验证损失的影响变得很小。
1.定义
强制让模型权重只能取较小的值,从而限制模型的复杂度,使得权重值的分布更加规则。
2.实现方法
向网络损失函数中添加与较大权重值相关的成本,成本有两种形式:
3.在Keras中,添加权重正则化的方法是向层传递权重正则化实例作为关键字参数。
l2(0.001) 的意思是该层权重矩阵的每个系数都会使网络总损失增加0.001 * weight_coefficient_value。
from keras import models
from keras import layers
from keras import regularizers
model = models.Sequential()
model.add(layers.Dense(16, kenel_regularizer=regularizers.l2(0.001),
activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kenel_regularizer=regularizers.l2(0.001),
activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
另外,还可以使用以下这些权重正则化来代替L2正则化。
# L1正则化
regularizers.l1(0.001)
# 同时做L1和L2正则化
regularizers.l1_l2(l1=0.001, l2=0.001)
1.定义
对某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为0)。
drop比率是被设为0的特征所占的比例,通常在0.2~0.5之间。
测试时没有单元被舍弃,而该层的输出值需要按dropout比率缩小,因为这时比训练时有更多的单元被激活,需要加以平衡。
2.实例
假设一个包含某层输出的Numpy矩阵layer_output,其形状为(batch_size, features)。
(1)训练时,随机将矩阵中的一部分值设为0:
# 训练时,舍弃50%的输出单元
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)
(2)测试时,将输出按照dropout比率缩小,在这里乘以0.5,因为前面舍弃了50%的单元:
layer_output *= 0.5
为了实现上述过程,还可以让两个运算在训练时进行,而测试时保持输出不变:
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)
layer_output /= 0.5 # 在训练时应该是成比例放大
3.在Keras中,可以通过Dropout层向网络中引入dropout,它将被应用于前面一层的输出。
model.add(layers.Dropout(0.5))
衡量成功的指标应该直接与目标保持一致。
1.目标
获得统计功效,即开发一个小型模型,能够打败纯随机的基准。
2.构建第一个工作模型的三个关键参数
在得到具有统计功效的模型后,需要开发一个过拟合的模型,始终监控训练损失和验证损失,以及所关心的指标的训练值和验证值。一旦模型在验证数据上的性能开始下降,那么就出现了过拟合。
下一阶段将开始正则化和调节模型,以便尽可能地接近理想模型。
在这一步骤中,将要不断调节模型、训练、在验证数据上评估,再次调节模型,然后重复这一过程,直到模型达到最佳性能。
但是,如果多次使用验证过程来反馈调节模型, 会降低验证过程的可靠性。