Machine learning 损失函数与深度学习

Machine learning 损失函数与深度学习,machine-learning,neural-network,deep-learning,loss-function,Machine Learning,Neural Network,Deep Learning,Loss Function,来自deeplearning.ai: 构建神经网络的一般方法是: 定义神经网络结构(输入单元、隐藏单元等) 初始化模型的参数 循环: 实现前向传播 计算损失 实现反向传播以获得梯度 更新参数(梯度下降) 损失函数如何影响网络的学习方式 例如,以下是我对正向和反向传播的实现,我认为这是正确的,因为我可以使用以下代码训练模型,以获得可接受的结果: 范围内i的(迭代次数): #正向传播 Z1=np.点(重量层1,xtrain)+偏差层1 a_1=乙状结肠(Z1) Z2=np.dot(权重层2,a层

来自deeplearning.ai:

构建神经网络的一般方法是:

  • 定义神经网络结构(输入单元、隐藏单元等)
  • 初始化模型的参数
  • 循环:
    • 实现前向传播
    • 计算损失
    • 实现反向传播以获得梯度
    • 更新参数(梯度下降)
  • 损失函数如何影响网络的学习方式

    例如,以下是我对正向和反向传播的实现,我认为这是正确的,因为我可以使用以下代码训练模型,以获得可接受的结果:

    范围内i的
    (迭代次数):
    #正向传播
    Z1=np.点(重量层1,xtrain)+偏差层1
    a_1=乙状结肠(Z1)
    Z2=np.dot(权重层2,a层1)+偏差层2
    a_2=乙状结肠(Z2)
    mse\u成本=np.sum(所有示例的成本)
    成本交叉熵=-(1.0/len(X_列)*(np.dot(np.log(a_2),Y_列.T)+np.dot(np.log(1-a_2),(1-Y_列.T)))
    #反向传播和梯度下降
    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(列表(map(lambda x:[sum(x)],d_Z2)))
    #在负渐变方向执行参数更新以减少损失
    权重层2=权重层2+np.乘法(-learning\u rate,d\u weight\u 2)
    偏差2=偏差2+np.乘法(-learning\u rate,d\u bias\u 2)
    d_a_1=np.dot(重量层,d_Z2)
    d_Z1=np.乘法(d_a_1,d_sigmoid(a_1))
    d_重量_1=np.dot(d_Z1,xtrain.T)
    d_bias_1=np.asarray(列表(map(lambda x:[总和(x)],d_Z1)))
    权重层1=权重层1+np.乘法(-learning\u rate,d\u weight\u 1)
    偏差1=偏差1+np.乘法(-learning\u rate,d\u bias\u 1)
    
    请注意以下几行:

    mse\u cost=np.sum(所有示例的成本)
    成本交叉熵=-(1.0/len(X_列)*(np.dot(np.log(a_2),Y_列.T)+np.dot(np.log(1-a_2),(1-Y_列.T)))
    
    我可以使用mse损失或交叉熵损失来告知系统的学习情况。但这只是为了提供信息,成本函数的选择不会影响网络的学习方式。我相信我没有像深度学习文献中经常提到的那样理解一些基本的东西——损失函数的选择是深度学习的一个重要步骤?但正如我上面的代码所示,我可以选择交叉熵或mse损失,并且不影响网络的学习方式,交叉熵或mse损失仅用于信息目的

    更新:

    例如,下面是deeplearning.ai中计算成本的代码片段:

    #分级功能:计算成本
    def计算成本(A2,Y,参数):
    """
    计算等式(13)中给出的交叉熵成本
    论据:
    A2——第二次激活的sigmoid输出,形状(1,示例数)
    Y--“真”标签形状向量(1,示例数)
    参数——包含参数W1、b1、W2和b2的python字典
    返回:
    成本——给定等式(13)的交叉熵成本
    """
    m=Y.shape[1]#示例数
    #从参数中检索W1和W2
    ###在这里开始代码###(≈ 2行代码)
    W1=参数['W1']
    W2=参数['W2']
    ###结束代码在这里###
    #计算交叉熵代价
    ###在这里开始代码###(≈ 2行代码)
    logprobs=np.multiply(np.log(A2),Y)+np.multiply((1-Y),np.log(1-A2))
    成本=-np.总和(logprobs)/m
    ###结束代码在这里###
    成本=np。挤压(成本)#确保成本是我们期望的维度。
    #例如,将[[17]]变为17
    断言(持续(成本、浮动))
    退货成本
    

    该代码按预期运行,实现了高精度/低成本。除了向机器学习工程师提供有关网络学习情况的信息外,本实施中不使用成本值。这使我质疑成本函数的选择如何影响神经网络的学习?

    好吧,这只是一个粗略的高层次尝试,以回答可能是离题的问题(因为我从原则上理解了你的困惑)

    除了向机器学习工程师提供有关网络学习情况的信息外,本实施中不使用成本值

    这其实是对的,;仔细阅读Andrew Ng的Jupyter笔记本,了解您发布的
    compute\u cost
    功能,您将看到:

    5-成本函数 现在,您将实现正向和反向传播。您需要计算成本,因为您需要检查您的模型是否真正在学习

    实际上,这是在代码中显式计算代价函数的实际值的唯一原因

    但这只是为了提供信息,成本函数的选择不会影响网络的学习方式

    别那么快!以下是(通常看不见的)陷阱:

    成本函数的选择决定了用于计算
    dw
    db
    数量的精确方程式,从而决定了学习过程

    注意,这里我谈论的是函数本身,而不是它的值

    换句话说,像你的计算

    d_weight_2 = np.dot(d_Z2, a_1.T)
    

    它们不是从天而降,但它们是应用于特定成本函数的反向传播数学的结果

    以下是Andrew在Coursera的入门课程中的一些相关高级幻灯片:

    希望这有帮助;从成本函数的导数开始计算
    dw
    db
    的具体方式超出了本文的范围,但是你可以在反向传播在线上找到一些好的教程(这是一个)d_weight_1 = np.dot(d_Z1, xtrain.T)