Neural Network
- 人工神经的出发点是生物神经(建立神经,原始智能),但是已经逐渐背离,因为人类对神经科学的认知水平还远远不够
- 分层(layer)
- 输入相同或相似的特征的神经元组成 layer
- 每层输入一个向量返回一个,每层可以有一个
- 每层的输出也称为激活值(activations 来源于生物神经学)
- 输入层
- layer 0
- 隐藏层
- 在数据集中没有明确的正确值也在训练集中没有这些值,一些输出层需要依赖的特征比如预测衣服是否会畅销,隐藏层就有知名度,感知质量,可承担等,这些都是没有明确正确的值
- 输出层
- 不需要手动设计更好的特征,它可以自己学习特征(在隐藏层中使用的特征)
- neural network architecture
- 你需要多少个隐藏层,每层需要多少个神经元
forward propagation
- 将输入数据沿着网络的正向方向传递,每个隐藏层接受输入数据,根据
activation function进行处理,并传递到下一层。
- 输入数据沿着从输入层到输出层的方向,依次经过每一层的加权求和、加偏置和激活函数等操作,得到输出结果的过程
- 假如输入层 有 3 个神经元 第一个隐藏层 有 4个神经元 此时权重矩阵的大小为
3x4隐藏层中的每个神经元 都有三个不同的权重,分别与输入层中的三个神经元相连,权重通常是随机初始化的,然后通过反向传播算法来更新。反向传播算法通过计算损失函数对权重的梯度来更新权重,以最小化损失函数。
- python 实现
- TensorFlow 实现
layer_1 = Dense(units-3, activation="sigmoid") layer_2 = Dense(units-1, activation="sigmoid") model = Sequential([layer_1, layer_2]) x = np.array([200.0, 17.0],F [120.0, 5.0], [425.0, 20.0], [212.0, 18.0]]) y = np.array([1, 0, 0, 1]) model.compile(...) # 训练神经网络函数 model.fit(x, y) # 调用模型 用X Y训练拟合它 model.predict(x_new) # 预测新数据
activation function
- Rectified Linear Unit,ReLU
- 修正线性单元
- 是一种常用于深度学习模型中的激活函数。它的定义为:
f(x) = max(0,x)也就是说,如果它接收到一个负数输入,它会返回0 ,如果它接收到一个正数输入,它会返回相同的正数值 - 用于结果只取非负数,经常用于 Hidden Layer
- ReLU函数的输出不是以0为中心的,这会改变输入数据的分布,下一层输入数据的分布跟前一层输入数据分布不同,会大大降低模型的训练速度,因为需要不断地适应不同的输入分布,拖慢了训练速度。
- 但是,归一化处理可以保证神经网络每一层的输入保持相同的分布。这样做可以避免梯度消失问题,且可以加快收敛
- 数据在预处理层归一化了,然后ReLU改变了数据分布,再使用BatchNormalization 重新改正数据分布
- 数据分布
- 数据值的均值、方差、偏度、峰度等统计量。归一化处理可以将数据值转换为具有相同均值和方差的分布,从而保证神经网络每一层的输入保持相同的分布
- 数据分布不同,比如第一组数据的范围为0-1 如果值为0.9 表示高权重,但是如果第二组数据值的范围为0-99 此时的 0.9权重就很低,神经网络就要根据反向传播大幅度 更新权重来重新适应数据分布
- 分布不同可能会导致梯度消失或梯度爆炸等问题,影响网络的收敛速度和效果
- 学习率过大可能导致ReLU神经元死亡
- 学习过大导致更新过快输入为负数,输出为0,导致反向传播导数为0,权重无法更新
- 有时不一定是坏事
- 使用更多,计算速度比Sigmoid更快,能让Gradient Descent更快,Sigmoid函数图形中左右两边都会变平,而 ReLU 只有右边才会变平(如对比图图所示),Gradient Descent 只优化了cost function 没有优化 activation function 但是 activation function 也是计算的一部分,使用 sigmoid让函数很多地方曲线是平滑的使得 Gradient 很小,也减慢了 Gradient Descent 的速度
- ReLU6
f(x) = min(max(0,x), 6)- 也就是说它对负数输入输出零,对正数输入输出相同的值直到6,对大于6的输入输出6
- ReLU6可以防止激活值过大而导致数值问题,特别是在使用低精度格式如float16时
- ReLU6也可以减少激活值的范围并使其更加均匀,这可能有利于量化的性能
- ReLU6也可能在激活值接近6时造成梯度饱和,从而降低学习速度,输入大于6或者小于0会导致神经元不会更新权重,可能限制了模型的表达能力,因为它截断了输出的范围。
- LeakyReLU
- LeakyReLU 是一种基于 ReLU 的激活函数,但它对于负值具有小的斜率而不是平坡斜率。斜率系数在训练之前确定,即在训练期间不学习。LeakyReLU 函数几乎与标准 ReLU 函数相同。Leaky ReLU 为了在优化过程中潜在更强的梯度而牺牲了硬零稀疏性。Alpha 是一个固定参数(float >= 0.)。与标准 ReLU 函数不同,Leaky ReLU 在其整个定义域内都具有非零梯度
- alpha参数是控制leaky_relu的负斜率系数,也就是当输入小于0时,输出的比例。alpha的默认值是0.3,也可以自己指定。alpha的值越大,表示负数部分的梯度越大,可以避免神经元“死亡”的问题
- 如果输入是-1,那么输出就是-1乘以alpha参数,也就是负数部分的梯度。例如,如果alpha是0.3,那么输出就是-0.3
- ParametricReLU
- Parametric ReLU 具有 LeakyReLU 相同的优点,唯一的区别在于负输入的输出斜率是一个可学习的参数,而在 Leaky ReLU 中它是一个超参数
- swish
- Swish的公式是
swish(x) = x * sigmoid(x),其中sigmoid(x) = 1 / (1 + e^(-x)) - Swish是一个平滑的函数,而ReLU是一个分段的函数。这意味着Swish没有突然的变化或顶点,而ReLU有一个在零点处的折点
- • Swish是一个非单调的函数,而ReLU是一个单调的函数。这意味着Swish的导数在某些点是负的,在某些点是正的,而ReLU的导数在所有点都是正的或零。
- Swish是一个自适应的函数,而ReLU是一个固定的函数。这意味着Swish可以根据输入调整自己的形状,而ReLU总是保持相同的形状
- Swish在性能方面比ReLU有显著的提升,特别是在更深层次的模型中。这可能是因为Swish可以更好地捕捉输入的复杂性和非线性,而ReLU可能会丢失一些信息
- Sigmoid
- 用于二分类问题
- 为什么不使用 Sigmoid作为隐藏层激活函数
- 因为Sigmoid导数取值范围 为
0-0.25,在反向传播中如果有多个 Sigmoid Layer 由于导数链式法则 就会导致 多个0-0.25的值相乘导致梯度消失 - 输入每层神经网络的均值为0最好,而Sigmoid的输出都是正整数,会使收敛变慢
- 存在幂运算,计算复杂度大训练时间长
- Linear activation function
- 线性激活函数是一种简单的激活函数,它将输入直接输出,不进行任何转换
- 用于结果可以为正数也能为负数
- 不要在 Hidden Layer中使用,一般在output Layer
f(x) = g(z) = z
- softmax
- 多分类
- 它将向量中的实数转换为概率分布,使得每个元素的取值范围在0到1之间,且所有元素的和为1
- 为什么需要 activation function
- 如果一个神经网络只包含线性激活函数,那么它实际上只是一个线性模型,无论它有多少层。这是因为线性函数的复合仍然是线性的。也就是说,如果我们将多个线性函数相互叠加,最终得到的仍然是一个线性函数,比起使用一个这样的的神经网络不如直接使用线性回归模型
- 因此,只包含线性激活函数的多层神经网络并不能提升计算复杂特征的能力。它只能学习数据中的线性关系,而不能学习更复杂的非线性关系
- 或者一个神经网络的所有层都包含线性激活函数,只有输出层为Sigmoid函数,那么这个神经网络仍然可以被视为一个线性模型,只不过它的输出被压缩到了0和1之间
- 这是因为线性函数的复合仍然是线性的。也就是说,如果我们将多个线性函数相互叠加,最终得到的仍然是一个线性函数。在这种情况下,Sigmoid函数只是将线性模型的输出压缩到了0和1之间。
- 因此,这样的神经网络只能学习数据中的线性关系,而不能学习更复杂的非线性关系。如果我们希望神经网络能够学习更复杂的数据结构,我们需要在隐藏层中使用非线性激活函数(例如Sigmoid、ReLU等)
Loss function
- Mean Squared Error
- 线性回归通常使用的损失函数
- 均方误差是模型预测值与真实值之间差的平方的平均值。它衡量了模型预测值与真实值之间的差异,目标是最小化这个差异
- binary cross entropy
- 二进制交叉熵是一种损失函数,用于评估二进制分类器的预测概率与实际类标签之间的差异。它通过比较每个预测概率与实际类输出(可以是0或1)来计算,然后根据预测概率与期望值之间的距离计算惩罚分数
- Sparse Categorical Crossentropy & Categorical Crossentropy
- Sparse Categorical Crossentropy 是一种损失函数,用于多类分类问题。它与 Categorical Crossentropy 相似,但区别在于标签的格式(multi-lable classification)。如果您的标签是整数形式,而不是 one-hot 编码形式,则应使用 Sparse Categorical Crossentropy。
- 例如,假设您有一个三类分类问题,其中类别分别为 0、1 和 2。如果您的标签是整数形式,例如 [0]、[1] 和 [2],则应使用 Sparse Categorical Crossentropy。但是,如果您的标签是 one-hot 编码形式,例如 [1,0,0]、[0,1,0] 和 [0,0,1],则应使用 Categorical Crossentropy。
- Sparse Categorical Crossentropy 的一个优点是它可以节省内存和计算时间,因为它只使用一个整数来表示一个类别,而不是整个向量
- Sparse 是指每个数字只能是这个类别中的一个
- layer n 的 activations
- training examples
- 很小的正数接近于0(Epsilon)
- activation function
g- test examples
- activation of layer l unit j
- cross validation
AGI&ANI&ASI
- Artificial Narrow Intelligence
- 只能在某个特定领域或任务上表现出智能的人工智能
- Artificial General Intelligence
- 可以像人类一样在各种领域和任务上表现出智能和创造力的人工智能
- Artificial Super Intelligence
- 超越人类智能水平的人工智能
- 大量的人工神经元不能做出AGI
- 因为人工神经网络比生物神经模型简单太多,现在人类还不知道大脑的工作原理(生物神经元输入到输出)做不出类似大脑强大的神经网络
- one learning algorithm 假设
- 强大智能的实现只需要一个或者几种算法
- 比如训练大脑的听觉皮层,听觉皮层会接收耳朵发出的电脉冲信号(听到的声音),将耳朵与听觉皮层的连接切断把图像输入到听觉皮层,让听觉皮层学会去看
- 再比如训练躯体感知皮层,躯体感知皮层接收的是触觉信号,切断他的触觉感知让他接受图像输入,然躯体感知皮层学会看
- 有一系列的实验显示了大脑的许多不同部位只依赖不同的数据就能分别学会 去看、去感受、去听,也许有一种算法也能根据输入学会相应的处理
example:一个相机被装在人的头部,将图像映射到他的舌头上的网格上的电压模式,通过将灰度图像映射到舌头上的电压模式,可以帮助人们学会用舌头看东西
Matrix multiplication
- 只能取长度相同向量的点积,所以两个矩阵的数据长度需要匹配 比如 转置后矩阵的行,和第二个矩阵的列
- 新的矩阵形状为 转置矩阵的行数和另一个矩阵的列数
- transposition
- 转置可以用来调整矩阵的形状,以便它们可以相乘。矩阵乘法要求第一个矩阵的列数与第二个矩阵的行数相等。如果您的矩阵不满足这个条件,那么您需要对其中一个矩阵进行转置,以使它们的形状匹配
- 行列互转
AT = A.T # 将矩阵A转置 tensorflow默认样本是行向量,而非列向量,不需要转置 Z = np.matmul(AT, W) # 计算矩阵乘法 Z = AT @ W # matmul另一种调用方式
- 转置矩阵的row对应index的数 乘以 另一个矩阵的 columns对应index的数
image
- numpy 广播
- 当一个矩阵与一维数据需要进行矩阵运算时,就需要使用 numpy 广播来拉伸一维数据,这样逐元素操作才有意义
- 通过复制元素来拉伸较小维度以匹配较大维度
- 在对两个数组进行操作时,NumPy逐元素比较它们的形状。它从末尾(即最右边)的维度开始,然后向左工作
back propagation & Gradient Descent
- 反向传播是一种用于计算神经网络中误差函数关于权重的梯度(导数项)的算法(自动微分算法)。梯度下降是一种优化算法,它通过沿着梯度的负方向更新参数来最小化目标函数。
- 在训练神经网络时,反向传播和梯度下降通常结合使用。首先,使用反向传播计算误差函数关于权重的梯度。然后,使用梯度下降根据计算出的梯度更新权重。这个过程不断重复,直到网络收敛到一个局部最优解。
- What is a derivative?
- computation graph
- 计算图是一种数据结构,用于表示神经网络或深度学习模型的计算。它由表示操作(如矩阵乘法、激活函数等)的节点和表示张量(在操作之间流动的数据)的边组成。
- 计算图可以帮助可视化模型的结构和依赖关系,以及进行自动微分和优化。
- Larger Neural Network Example
- 反向传播的过程就是给你一种非常高效的方法来计算所有的导数
- 比如 j 对 w1、j 对 b1、j 对 w2 和 j 对 b2 的导数。你可以把这些导数输入到梯度下降算法或者 Adam 优化算法中,来训练你的神经网络的参数
- 我们使用反向传播的原因是,它是一种非常有效的方法来计算j对w1、j对b1、j对w2和j对b2的所有导数。而不是像我们刚才做的那样(向前传播),从左到右地计算,并且要对每个参数一个一个地进行计算
- 如果我们要把 w 增加 0.001 来看看 j 的变化,然后把 b1 增加一点点来看看 j 的变化,然后对每个参数都增加一点点来看看 j 的变化,那么这就变成了一种非常低效的计算方法
- 如果你在计算图中有 N 个节点和 P 个参数,这种方法就需要 N x P 步来完成,这是非常低效的。而我们用反向传播得到了所有四个导数,只需要 N + P 步(back prop or Symbolically),而不是 N x P 步(forward prop or Arithmetically),在实际的神经网络中,这种差别是非常大的,因为计算图中的节点和参数的数量可能非常多
- Arithmetically
- forward prop
- 指直接使用数值计算梯度,例如使用有限差分法,即在每个参数上加上一个很小的值,然后计算损失函数的变化量,从而得到梯度的近似值。这种方式的优点是简单直观,不需要知道损失函数的具体形式,但缺点是计算量大,精度低,容易受到数值误差的影响
- Symbolically
- back prop
- 指使用符号计算梯度,例如使用自动微分法,即根据损失函数的表达式,利用链式法则和求导规则,自动推导出梯度的表达式。这种方式的优点是计算量小,精度高,不受数值误差的影响,但缺点是需要知道损失函数的具体形式,可能涉及复杂的符号运算。
多分类
- 结果不再是两个中的一个,而是一个而是多个中的一个,但是范围也是一个离散值(有限),最终的输出也只有一个
- softmax是逻辑回归的泛化,针对多分类的二元分类算法
- 每个 training example 的 y 只能取一个值
- 只计算a的某一个j值也需要计算出所有z的值才能得出,其他的算法例如Sigmoid、ReLU都不需要
- 在上面的Loss function中,只有与目标对应的行对损失有贡献,其他行为零。要编写成本方程,我们需要一个
indicator function,当索引与目标匹配时为1,否则为零 - output layer 输出 logits 提高数值稳定性
- logits 指的是神经网络最后一层的输出,它们还没有经过 softmax 或者 sigmoid 函数,所以它们不是归一化的概率分布,而是原始的 logits
- 当你的模型输出是 logits 时,如果你再对它们进行 softmax,然后再计算 Loss function ,可能会导致数值上的问题,比如溢出或者下溢(因为 softmax 函数会将输入的数据压缩到 [0,1] 的范围内,而且不同的数值之间差异很小,这样会导致数值精度的损失。如果输入的数据过大或过小,就会出现溢出或下溢的问题)
- 如果你直接将 logits 输入到 Loss function 中(不使用 softmax 或者 sigmoid 提前计算出 a = g(z) 的值),并且设置 from_logits=True,那么 Loss function 会自动对它们进行 softmax,并且使用一种更加稳定的计算方式,避免了数值上的问题
- 此时output layer 没有 softmax 将输出转换为概率分布,返回的是原始值(z_j)而不是概率值(a_j)
- 需要重新把输出值(logits)映射到 Loss function(softmax) 中得到概率
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), # 神经网络中的第一层应与您的数据形状相同。现在我们的数据是28x28的图像,而28层28个神经元是不可行的,因此将28 * 28“展平”为784x1更有意义。我们不用自己编写所有代码来处理这些问题,而是在开头添加Flatten()层,当数组稍后加载到模型中时,它们将自动为我们展平 tf.keras.layers.Dense(128, activation=tf.nn.relu), # tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) tf.keras.layers.Dense(10, activation='linear')]) from tensorflow.keras.losses import SparseCategoricalCrossentropy model.compile(optimizer = tf.optimizers.Adam(), # loss = 'sparse_categorical_crossentropy', loss = SparseCategoricalCrossentropy(from_logits=True), # 输出是否经过概率分布 metrics=['accuracy']) model.fit(training_images, training_labels, epochs=10) model.evaluate(test_images, test_labels) # classifications = model.predict(test_images) # print(classifications[0]) classifications = model.predict(test_images) f_x = tf.nn.softmax(classifications) print(f_x[0])
multi-lable classification
- 结果为多个
Adaptive Moment Estimation
- 自动调整 Learning rate 大小,比Gradient Descent 更快,现在成为了主流
- 不会全局使用一个 Learning rate ,模型的每个参数都有不同的Learning rate
- 是一种随机优化方法,它使用梯度的第一和第二矩来计算每个参数的自适应Learning rate。第一矩是均值的估计,第二矩是梯度的非中心方差的估计
- 在处理大型问题时非常高效,这些问题涉及大量数据或参数。它需要较少的内存,并且在大型数据集上表现优异。它也像一个带有摩擦力的重球一样,更喜欢误差曲面上的平坦极小值
preferred_model = Sequential( [ Dense(25, activation = 'relu'), Dense(15, activation = 'relu'), Dense(4, activation = 'linear') ] ) preferred_model.compile( loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), optimizer=tf.keras.optimizers.Adam(0.001), <- ) preferred_model.fit( X_train,y_train, epochs=10 )
Numerical Stability
- 这些方法Tensorflow已经实现,不需要手动实现
Softmax Numerical Stability
Cross Entropy Loss Numerical Stability
Model evaluation
- 将数据集拆分(8 2 or 7 3)为
test set&training set
- 可以系统地评估模型的学习成果,通过计算
J_tests&J_train可以衡量模型在测试集和训练集上的表现
- 这个过程是为机器学习应用自动选择合适模型的第一步
- Linear regression
- classification regression
- 还有一种方法,不去计算
test error&train error而是去衡量test set&train set中被错误分类的部分
- 如果想用测试集选择合适的特征,但是可能会导致J_test 比实际误差小(比泛化后的实际误差要低),使用
cross-validation来选择模型解决此问题
image
the cross-validation set- 抉择一部分数据成为交叉测试集,使用交叉测试集
error最小的模型,来确定模型 - 做决定只看训练集和交叉验证集,不看测试集,最后再用测试集验证泛化能力
- 这样可以确保没有任何东西添加到测试集,这样测试集就会变得很公平,因为没有让模型提前学习到测试集(没有使用测试集做任何决定),所以不会对泛化的误差过度乐观
classification计算 算法错误分类的交叉验证样本的比例,不计算error
img
Bias & Variance
- 通过计算
J_train&J_cv即使不用画出f(x)也能判断算法是否有高偏置或者高方差
- High bias
J_train&J_cvis high
- High variance
J_trainis lowJ_cvis high
- 极少数情况下 高偏置和高方差会同时存在,比如一部分数据过拟合,一部分数据欠拟合
- 通过
regularization解决
- 通过交叉验证选取一个好的
λ
- 不同的值
λ带来的影响
- baseline
- 基于baseline来判断
J_train是否 high - 判断训练集误差是否高,应该观察误差是否大于人类,这样更有用,比如语音识别 J_train 10.4%, J_test 14% 但是人类识别也会有 10%的误差,所以这算不上higt bias,应该是higt variance
- 对于 图像识别,语音识别,就算是人类 误差也不可能达到 0%,应该以人类的误差来设置一个baseline 而不是 0%
- Learning curves
- 可以先用一小部分数据来绘制学习曲线观察模型是否存在 High bias 或者 High variance
- 但是在实际中使用了不同大小的数据集训练多种不同的模型是需要非常多的算力的,所以在实际中这种做法并不常见
J_train的error会随着数据集增大而增大,因为数据量过小会导致过拟合- High bias
- High variance
- 增大神经网络如何选择了一个合适的
regularization value不会比小型的神经网络更容易high variance,会比小型的神经网络更好,只是计算成本会变得更高
- 只要训练集不是太大在大型的神经网络中一般都不会出现
high bias,它可以拟合非常复杂的函数
- Error Analysis Process
- 人工手动检查错误的样本,只能对于人类擅长的任务使用
- 如果错误集过大可以抽取一部分数据
- 观察错误数据的共同特征,再通过特征,针对性训练模型,不是那么重要的错误不值得花很多时间修复
添加数据
- Data Augmentation
- 数据增强是一种用于增加训练数据量的方法。它通过对现有数据进行变换,如旋转、缩放、翻转等,来生成新的训练数据。这样可以增加模型的泛化能力,提高模型在不同条件下的表现
- 例如对图片添加噪声或者扭曲,对语音添加环境声
- 数据增强 发生在 将图片加载到内存时,再对图片增强传输到神经网络,不会直接修改硬盘上的图片
- 图像增强在训练图像中引入随即元素,但是如果验证集没有有相同的随机性(多样性太稀疏),他的结果正确率会浮动很大,所以不仅需要一套多样性丰富的图像来训练,测试也需要一套这样的图像
- 如果验证集没有与训练集相同的多样性,那么模型的泛化能力可能会受到影响。因此,有些会在测试时也使用数据增强的方法,例如翻转、裁剪、旋转等,来提高模型的鲁棒性和准确率。但是,这并不是必须的,也要根据实际场景和任务来决定是否使用数据增强
- Data Synthesis
- 使用人工生成的数据来训练深度学习模型,在计算机视觉领域使用较多
- 数据合成可以解决真实数据难以获取、标注或保护隐私的问题,也可以增加数据的多样性和质量,提高模型的泛化能力和性能。数据合成的方法有很多,比如使用三维渲染、图像变换、对抗生成网络等
- Color shifting
- PCA
- 它根据图像的自然变化,改变RGB通道的强度,这些变化由像素颜色的主成分表示。它对颜色通道执行主成分分析,因此被称为Fancy PCA。
- 该算法的工作原理是首先将图像展平为RGB列,然后将像素围绕其均值居中,然后加上一个与RGB像素值的协方差矩阵的特征值和特征向量成比例的量1。这个量乘以一个从均值为0,标准差为0.1的高斯分布中抽取的随机变量。
- PCA色彩增强算法可以通过利用像素颜色的自然变化,提高彩色图像的质量和对比度。它也可以作为无监督特征学习和深度学习算法的预处理步骤
MLOps
- machine learning opeartions
- 机器学习运维(MLOps)是开发/运维(DevOps)团队使用机器学习模型的过程,MLOps 旨在通过定义流程,使机器学习模型的开发和部署更加可靠和高效
- 机器学习项目的源代码控制
- 自动化机器学习工作流
- 机器学习模型的持续部署
- 机器学习资产的监控和治理
precision & recall & accuracy
- precision
- 精确度
- 模型正确预测为正例的样本占所有预测为正例的样本的比例(查准率)
- 反映了模型在分类正例时的可信度
- Recall
- 召回率
- 模型正确预测为正例的样本占所有真实为正例的样本的比例(查全率)
- 反映了模型能够找到多少正例
- accuracy考虑了所有样本的正确分类情况,Precision 考虑了模型如何分类正样本和负样本,而 recall 只考虑了模型如何分类正样本
- accuracy
- 准确率
- 模型正确预测的样本占所有样本的比例。它反映了模型的总体表现
- TP(真正例)是指模型正确预测为正例的样本
- TN(真负例)是指模型正确预测为负例的样本
- FP(假正例)是指模型错误预测为正例的样本
- FN(假负例)是指模型错误预测为负例的样本
- 提高阈值会增加precision,会导致Recall降低
- 权衡Precision 和 Recall
- 不能使用交叉验证集自动选出阈值,因该手动选择一个阈值来权衡Precision和Recall
- F1 score
- 在数学中也称为PR调和均值,它更强调较小的值
- F1-score可以根据不同的场景进行调整,给予precision或recall更高的权重。常见的调整后的F-score有F0.5-score和F2-score,以及标准的F1-score
gradient vanishing and gradient explosion
- 梯度消失是指在反向传播过程中,从输出层向输入层逐层计算梯度时,梯度的值变得越来越小,接近于零。这会导致网络中靠近输入层的参数无法得到有效的更新,从而影响网络的学习能力
- 梯度爆炸是指在反向传播过程中,从输出层向输入层逐层计算梯度时,梯度的值变得越来越大,超过一定的阈值。这会导致网络中的参数更新过大,使得网络变得不稳定,甚至出现NaN值
- 它们发生的原因是微积分的链式法则,它用于通过将后续层的梯度相乘来计算每一层的梯度。如果后续层的梯度小于1,那么反复相乘会使当前层的梯度趋近于零。这就是梯度消失问题。如果后续层的梯度大于1,那么反复相乘会使当前层的梯度呈指数增长。这就是梯度爆炸问题
- 梯度消失经常出现在深层网络中,或者采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下
- 后果
- 网络变得不稳定和无法从训练数据中学习,网络可能会过早收敛到一个次优解或者偏离最优解,网络可能会出现NaN或者inf值在权重或输出中,这些值无法再被更新。
- 检测
- 模型在训练数据上有一个很差的损失或者一个很高的误差
- 模型在每次更新中显示出损失或误差的大幅波动
- 模型在权重或输出中有NaN或者inf值
- 有一些技术可以帮助预防或缓解梯度消失和梯度爆炸,例如
- 使用一个合适的权重初始化方法,平衡每一层输入和输出的方差
- 使用一个非饱和激活函数,不要将输入压缩到一个很窄的范围内,例如ReLU, Leaky ReLU, ELU等
- 使用一个批量归一化技术,将每一层输入归一化为零均值和单位方差,这可以减少内部协变量偏移并改善梯度流动
- 使用一个梯度裁剪技术,限制梯度的最大值为一个阈值,这可以防止它们爆炸
BatchNormalization
- 内部协变量偏移
- 有一个具有多层的深度神经网络。每一层都接收一些输入数据并对其执行一些操作,例如乘以权重,加上偏差并应用激活函数。一层的输出成为下一层的输入。现在,假设您开始使用一些初始随机权重训练网络。当您将数据批次馈送到网络时,每层的权重都将根据输出层的误差信号进行更新。这意味着每个批次后每层的输入分布都会发生变化,因为它们取决于前面各层的权重。例如,如果第1层的权重变大,则第2层的输入也会变大。这可能使第2层更难学习,因为它必须每次都适应新的分布。当您深入网络时,这个问题可能会变得更糟,因为较低层中的小变化会在通过网络传播时被放大。这就是内部协变量移位的含义:训练期间内部层输入分布的变化
- Sigmoid函数在两端都有一个平坦区域,其中输出接近0或1。这意味着如果输入过大或过小,输出不会改变太多,梯度将非常小。这会减慢学习过程并导致梯度消失。理想情况下,您希望输入位于Sigmoid函数的中间区域,其中输出对输入的变化敏感且梯度较大。但是,如果由于内部协变量移位而导致某一层的输入分布发生变化,则它可能会偏离这个最佳区域并进入平坦区域。例如,如果由于第1层中权重的更新而使第2层的输入变大,则它们可能会落入Sigmoid函数的右侧平坦区域并导致第2层的梯度消失。
- 批量归一化(BatchNormalization)可以通过对每个小批量对每层的输入进行归一化来帮助防止这个问题。这意味着它减去了每个输入变量在小批量中的平均值并除以标准差。这确保了输入具有零均值和单位方差,使它们更有可能落入Sigmoid函数的最佳区域。批量归一化还添加了两个可学习参数:每个输入变量的比例因子和移位因子。这些参数允许网络调整归一化后的输入以更好地适应数据分布并保留一些非线性。批量归一化可以通过减少内部协变量移位和改善梯度流来使训练更快更稳定。
- 每个批次后每层的输入分布都会发生变化
- 输入分布是指神经网络中每一层接收到的输入数据的分布。在深度神经网络中,每一层都接收一些输入数据并对其执行一些操作,例如乘以权重,加上偏差并应用激活函数。一层的输出成为下一层的输入。
- 在神经网络训练中,每个时期都会根据输出层的误差信号更新权重。这意味着每个批次后每层的输入分布都会发生变化,因为它们取决于前面各层的权重。例如,如果第1层的权重变大,则第2层的输入也会变大。这可能使第2层更难学习,因为它必须每次都适应新的分布。
- 假设我们有一个简单的两层神经网络,用于对手写数字进行分类。在训练过程中,每个时期都会更新权重并处理不同的图像数据。
- 在第一个时期,网络可能会处理一批图像,其中大多数都是数字“1”。这意味着第1层的输出将主要与数字“1”有关,因此第2层的输入分布也将主要与数字“1”有关。在这个时期结束时,根据输出层的误差信号更新权重。
- 在第二个时期,网络可能会处理一批图像,其中大多数都是数字“2”。这意味着第1层的输出将主要与数字“2”有关,因此第2层的输入分布也将主要与数字“2”有关。由于第1层的权重已经更新,因此第2层的输入分布将与第一个时期不同。
- 小批量梯度下降
- 在神经网络训练中,通常会将整个数据集分成多个小批量。在每个时期,网络会依次处理这些小批量,而不是整个数据集。这种方法称为小批量梯度下降
- 每个时期处理的图像可能不同,因为每个时期都会对小批量进行重新抽样和随机化。这样做的目的是增加训练过程中的随机性,有助于防止过拟合并提高模型的泛化能力
- 上面例子是为了说明每层输入分布如何在每个时期发生变化。实际上,在每个时期,网络会依次处理多个小批量,而不是只处理一批图像
