来自deeplearning.ai:
构建神经网络的一般方法是:
- 定义神经网络结构(输入单元数,隐藏单元数等)。
- 初始化模型的参数
- 循环:
- 实现正向传播
- 计算损失
- 实施向后传播以获得梯度
- 更新参数(梯度下降)
损失函数如何影响网络学习?
例如,这是我实现的正向和反向传播,我认为这是正确的,因为我可以使用以下代码来训练模型以达到可接受的结果:
for i in range(number_iterations):
# forward propagation
Z1 = np.dot(weight_layer_1, xtrain) + bias_1
a_1 = sigmoid(Z1)
Z2 = np.dot(weight_layer_2, a_1) + bias_2
a_2 = sigmoid(Z2)
mse_cost = np.sum(cost_all_examples)
cost_cross_entropy = -(1.0/len(X_train) * (np.dot(np.log(a_2), Y_train.T) + np.dot(np.log(1-a_2), (1-Y_train).T)))
# Back propagation and gradient descent
d_Z2 = np.multiply((a_2 - xtrain), d_sigmoid(a_2))
d_weight_2 = np.dot(d_Z2, a_1.T)
d_bias_2 = np.asarray(list(map(lambda x : [sum(x)] , d_Z2)))
# perform a parameter update in the negative gradient direction to decrease the loss
weight_layer_2 = weight_layer_2 + np.multiply(- learning_rate , d_weight_2)
bias_2 = bias_2 + np.multiply(- learning_rate , d_bias_2)
d_a_1 = np.dot(weight_layer_2.T, d_Z2)
d_Z1 = np.multiply(d_a_1, d_sigmoid(a_1))
d_weight_1 = np.dot(d_Z1, xtrain.T)
d_bias_1 = np.asarray(list(map(lambda x : [sum(x)] , d_Z1)))
weight_layer_1 = weight_layer_1 + np.multiply(- learning_rate , d_weight_1)
bias_1 = bias_1 + np.multiply(- learning_rate , d_bias_1)
注意以下几行:
mse_cost = np.sum(cost_all_examples)
cost_cross_entropy = -(1.0/len(X_train) * (np.dot(np.log(a_2), Y_train.T) + np.dot(np.log(1-a_2), (1-Y_train).T)))
我可以使用mse损失或交叉熵损失来告知系统学习情况。但这仅出于提供信息的目的,成本函数的选择不会影响网络的学习方式。我相信我不了解深度学习文献中经常提到的基本知识,即损失函数的选择是深度学习中的重要一步?但是,如我上面的代码所示,我可以选择交叉熵或mse损失,并且不影响网络学习的方式,交叉熵或mse损失仅用于提供信息?
更新:
例如,这是deeplearning.ai中的代码片段,用于计算成本:
# GRADED FUNCTION: compute_cost
def compute_cost(A2, Y, parameters):
"""
Computes the cross-entropy cost given in equation (13)
Arguments:
A2 -- The sigmoid output of the second activation, of shape (1, number of examples)
Y -- "true" labels vector of shape (1, number of examples)
parameters -- python dictionary containing your parameters W1, b1, W2 and b2
Returns:
cost -- cross-entropy cost given equation (13)
"""
m = Y.shape[1] # number of example
# Retrieve W1 and W2 from parameters
### START CODE HERE ### (≈ 2 lines of code)
W1 = parameters['W1']
W2 = parameters['W2']
### END CODE HERE ###
# Compute the cross-entropy cost
### START CODE HERE ### (≈ 2 lines of code)
logprobs = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
cost = - np.sum(logprobs) / m
### END CODE HERE ###
cost = np.squeeze(cost) # makes sure cost is the dimension we expect.
# E.g., turns [[17]] into 17
assert(isinstance(cost, float))
return cost
此代码按预期运行,并且可以实现高精度/低成本。除了向机器学习工程师提供有关网络学习程度的信息以外,此实现中未使用成本的价值。这使我怀疑成本函数的选择如何影响神经网络的学习方式?
答案 0 :(得分:4)
好吧,这只是一个粗略的高层尝试,目的是回答SO可能是一个离题的问题(据我原则上理解您的困惑)。
在此实现中不使用成本的价值,只是向机器学习工程师提供有关网络学习程度的信息。
这实际上是正确的;通过仔细阅读Andrew Ng的Jupyter笔记本来了解您发布的compute_cost
函数,您将看到:
5-成本函数
现在,您将实现正向和反向传播。您需要计算成本,因为您要检查模型是否在实际学习中。
从字面上看,这是在代码中显式计算成本函数的实际值的唯一原因。
但这只是出于参考目的,成本函数的选择不会影响网络的学习方式。
不是那么快!这是(通常是不可见的)捕获:
成本函数的选择决定了用于计算dw
和db
数量的精确方程式,从而决定了学习过程。
请注意,这里我说的是函数本身,而不是其值。
换句话说,像您这样的计算
d_weight_2 = np.dot(d_Z2, a_1.T)
和
d_weight_1 = np.dot(d_Z1, xtrain.T)
尚未从天而降,但它们是应用于特定成本函数的反向传播数学的结果。
以下是安德鲁在Coursera入门课程中的一些相关高级幻灯片:
希望这会有所帮助;从成本函数的导数开始,如何精确地达到dw
和db
的特定计算形式的细节超出了本文的范围,但是您可以找到有关以下内容的一些不错的教程在线反向传播(here是其中之一)。
最后,对于(非常)高级的描述,当我们选择错误的成本函数时会发生什么(用于多类分类的二进制交叉熵,而不是正确的分类交叉熵),您可以看一下依我在Keras binary_crossentropy vs categorical_crossentropy performance?的答案。