欢迎大家来到IT世界,在知识的湖畔探索吧!
今天给大家介绍的是关于机器学习和深度学习中的一项关键技术:正则化。正则化是防止模型过拟合的核心技术之一,总的来说,监督机器学习的核心原理莫过于如下公式:
该公式可谓是机器学习中最核心最关键最能概述监督学习的核心思想的公式了:所有的有监督机器学习,无非就是正则化参数的同时最小化经验误差函数。
最小化经验误差是为了极大程度的拟合训练数据,正则化参数是为了防止过分的拟合训练数据。
第二项中 λ 为正则化系数,通常是大于 0 ,是一种调整经验误差项和正则化项之间关系的系数。λ = 0 时相当于该公式没有正则化项,模型全力讨好第一项,将经验误差进行最小化,往往这也是最容易发生过拟合的时候。
随着 λ 逐渐增大,正则化项在模型选择中的话语权越来越高,对模型的复杂性的惩罚也越来越厉害。所以,在实际的训练过程中,λ 作为一种超参数很大程度上决定了模型的生死。
L1 和 L2 范数
系数 λ 说完了,然后就是正则化项,正则化项形式有很多,但最常见的也就是 L1 和 L2 正则化。
再说常见的 L1 和 L2 之前,先来看一下 L0 正则化。L0 正则化也就是 L0 范数,即矩阵中所有非 0 元素的个数。如何我们在正则化过程中选择了 L0 范数,那该如何理解这个 L0 呢?
其实非常简单,L0 fanshu就是希望要正则化的参数矩阵 W 大多数元素都为 0。如此简单粗暴,让参数矩阵 W 大多数元素为 0 就是实现稀疏而已。
在机器学习领域,L0 和 L1 都可以实现矩阵的稀疏性,但在实践中,L1 要比 L0 具备更好的泛化求解特性而广受青睐。
先说了 L1,但还没解释 L1 范数是什么,L1 范数就是矩阵中各元素绝对值之和,正如之前所说,L1 fan数通常用于实现参数矩阵的稀疏性。至于为啥要稀疏,稀疏有什么用,通常是为了特征选择和易于解释方面的考虑。
再来看 L2 范数。相较于 L0 和 L1,其实 L2 才是正则化中的天选之子。在各种防止过拟合和正则化处理过程中,L2 正则化可谓风头无二。
L2 范数是指矩阵中各元素的平方和后的求根结果。采用 L2 范数进行正则化的原理在于最小化参数矩阵的每个元素,使其无限接近于 0 但又不像 L1 那样等于 0,也许你又会问了,为什么参数矩阵中每个元素变得很小就能防止过拟合?
这里我们就拿深度神经网络来举例说明。在 L2 正则化中,如何使正则化系数变得比较大,参数矩阵 W 中的每个元素都在变小,线性计算的和 Z 也会变小,激活函数在此时相对呈线性状态,这样就大大简化了深度神经网络的复杂性,因而可以防止过拟合。
至于 L1 和 L2,江湖上还有一些混名,L1 就是江湖上著名的 lasso,L2 呢则是岭回归。
二者都是对回归损失函数加一个约束形式,lasso 加的是 L1 范数,ling回归加的是 L2 范数。可以从几何直观上看看二者的区别。
神经网络的正则化
说了半天的范数,下面我们就来看看在神经网络中如何进行正则化操作防止过拟合。我们在神经网络训练过程中继续采用交叉熵损失函数:
加了正则化项之后,损失函数形式如上所示,损失函数变了,反向传播的梯度计算也就变了,相应的反向传播也需要重新定义函数。
带正则化项的损失函数的定义:
def compute_cost_with_regularization(A3, Y, parameters, lambd): """
Implement the cost function with L2 regularization. See formula (2) above.
Arguments:
A3 -- post-activation, output of forward propagation, of shape (output size, number of examples)
Y -- "true" labels vector, of shape (output size, number of examples)
parameters -- python dictionary containing parameters of the model
Returns:
cost - value of the regularized loss function (formula (2))
"""
m = Y.shape[1]
W1 = parameters["W1"]
W2 = parameters["W2"]
W3 = parameters["W3"]
cross_entropy_cost = compute_cost(A3, Y) # This gives you the cross-entropy part of the cost
L2_regularization_cost = 1/m * lambd/2 * (np.sum(np.square(W1))+np.sum(np.square(W2))+np.sum(np.square(W3)))
cost = cross_entropy_cost + L2_regularization_cost
return cost
欢迎大家来到IT世界,在知识的湖畔探索吧!
反向传播的函数定义:
欢迎大家来到IT世界,在知识的湖畔探索吧!def backward_propagation_with_regularization(X, Y, cache, lambd): """
Implements the backward propagation of our baseline model to which we added an L2 regularization.
Arguments:
X -- input dataset, of shape (input size, number of examples)
Y -- "true" labels vector, of shape (output size, number of examples)
cache -- cache output from forward_propagation()
lambd -- regularization hyperparameter, scalar
Returns:
gradients -- A dictionary with the gradients with respect to each parameter, activation and pre-activation variables
"""
m = X.shape[1]
(Z1, A1, W1, b1, Z2, A2, W2, b2, Z3, A3, W3, b3) = cache
dZ3 = A3 - Y
dW3 = 1./m * np.dot(dZ3, A2.T) + lambd/m * W3
db3 = 1./m * np.sum(dZ3, axis=1, keepdims = True)
dA2 = np.dot(W3.T, dZ3)
dZ2 = np.multiply(dA2, np.int64(A2 > 0))
dW2 = 1./m * np.dot(dZ2, A1.T) + lambd/m * W2
db2 = 1./m * np.sum(dZ2, axis=1, keepdims = True)
dA1 = np.dot(W2.T, dZ2)
dZ1 = np.multiply(dA1, np.int64(A1 > 0))
dW1 = 1./m * np.dot(dZ1, X.T) + lambd/m * W1
db1 = 1./m * np.sum(dZ1, axis=1, keepdims = True)
gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2, "dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1,
"dZ1": dZ1, "dW1": dW1, "db1": db1}
return gradients
在实例中,加了正则化项和没加正则化项的模型分类结果可如图所见:
效果显而易见,加了正则化之后,神经网络的过拟合情况得到极大的缓解。
原文链接:
https://mp.weixin.qq.com/s/9cx1jXQAwICgiKLJcmmB2g
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/18325.html