【吴恩达Deep Learning】初学者学习记录2(神经网络/前后向传播)

本文介绍了神经网络的基础,包括其三层结构、本质和向量化的概念。讨论了sigmoid和tanh激活函数以及ReLU和LeakyReLU的优势。还详细阐述了神经网络的梯度下降法,并提供了前向传播和反向传播的Python代码实现。
摘要由CSDN通过智能技术生成

 

目录

1.神经网络

1)神经网络的概述

2)神经网络的本质 

3)向量化的解释

 2.激活函数

1)sigmoid函数和tanh函数

2)ReLU函数(修正线性单元)和Leaky ReLU函数

3)神经网络的梯度下降法计算

3.代码中的前后向传播


1.神经网络

1)神经网络的概述

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_15,color_FFFFFF,t_70,g_se,x_16

显而易见 ,神经网络分为三层。输入层,输入特征X(也可以用gif.latex?%5Cinline%20a%5E%7B%5B0%5D%7D表示,能向下传递激活值gif.latex?%5Cinline%20a%5E%7B%5B1%5D%7D,它是一个四维向量,python中表示为4*1的矩阵)。中间为隐藏层,“隐藏”就是输入到输出中的值,我们在训练中是看不见啊的。最后一层只带有一个节点,这个就是输出层,它负责输出并预测y帽的值(隐藏层维度举例(4,3)前面一个数表示隐藏层节点4,后面的数表示输入层特征3;输出层也有相关的向量维度(1,4)前者为输出层的节点数1,后者为隐藏层的节点数4)。

一般符号的约定是输入层不看作一个标准的层,只记隐藏层和输出层,因此上图的也称之为双层神经网络,第一层也指的是第一层的隐藏层。所以gif.latex?%5Cinline%20%7B%5Ccolor%7BDarkOrange%7D%20%7Dgif.latex?%5Cinline%20%7B%5Ccolor%7BDarkOrange%7D%20a%5E%7B%5B0%5D%7D%7D的右上角含义为第0层,即输入层。

2)神经网络的本质 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

这个图代表了回归计算的两个步骤,而神经网络的本质就是重复这些步骤很多次,所以神经网络的本质是为函数。下面附带如何在python代码中实现定义sigmoid函数:

def sigmoid(z):
    """
    参数:
        z  - 任何大小的标量或numpy数组。

    返回:
        s  -  sigmoid(z)
    """
    s = 1 / (1 + np.exp(-z))
    return s

3)向量化的解释

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

 图中右侧上部为单个样本实现向量化(实现正向传播)的四个公式,需从1到m遍历,下部为多个样本向量化实现的公式(在符号表示中,大写的为多样本的符号,小写为单样本符号)。gif.latex?%5Cinline%20a%5E%7B%5B1%5D%7D%3Dz%5E%7B%5B1%5D%7D%3Dw%5E%7B%5B1%5D%7Dx+b%5E%7B%5B1%5D%7D推导gif.latex?%5Cinline%20a%5E%7B%5B2%5D%7D%3Dw%27x+bgif.latex?%5Cinline%20a%5E%7B%5B2%5D%7D%3Dw%5E%7B%5B2%5D%7D%28w%5E%7B%5B1%5D%7Dx+b%5E%7B%5B1%5D%7D%29+b%5E%7B%5B2%5D%7D%3D%28w%5E%7B%5B2%5D%7Dw%5E%7B%5B1%5D%7D%29x+%28w%5E%7B%5B2%5D%7Db%5E%7B%5B1%5D%7D+b%5E%7B%5B2%5D%7D%29%3Dw%27x+b%27

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

此图为gif.latex?%5Cinline%20Z%5E%7B%5B1%5D%7D的吴恩达老师的推导过程,上部的gif.latex?%5Cinline%20b%5E%7B%5B1%5D%7D划掉以0作为特殊值方便理解。gif.latex?%5Cinline%20Z%5E%7B%5B1%5D%7D等号前中的gif.latex?%5Cinline%20z%5E%7B%5B1%5D%281%29%7D一系列值还需要加上gif.latex?%5Cinline%20b%5E%7B%5B1%5D%7D才是真正的值。

 2.激活函数

1)sigmoid函数和tanh函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

sigmoid函数的图像在上面,tanh是下面的。但用老师的话tanh函数几乎在所有场合都比sigmoid函数更优越,例外是输出层(使得y帽的值介于0到1之间不是-1到1)和在制作二分类的时候 。

sigmoid函数的导数可以简化为:a'=a(1-a)   tanh函数导数:a'=1-gif.latex?%5Cinline%20a%5E%7B2%7D

两个函数的缺点:当z值很大或很小的时候,梯度值会接近于零(ReLU函数能很好解决这个问题)。

2)ReLU函数(修正线性单元)和Leaky ReLU函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

ReLU函数的公式为a=max(0,z) 在代码运行中z几乎很难达到0。当不确定隐层用什么函数是可以选择ReLU函数。

Leaky ReLU函数 :a=max(0.01z,z)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

ReLU函数和Leaky ReLU函数可以使,在z=0处,令g'(z)为0.01或1(可以自己设置)

总而言之,当不知道用什么函数的时候,可以都试一试看哪个好。g(z)=z可以用于房地产价值预测

3.神经网络的梯度下降法计算

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

a = np.random.randn(4,3)
b = np.sum(a, axis = 1,keepdims = True) 
b.shape = (4,1)

其中keepdims = True 的目的是使得b.shape =(4,1)而不是(4,) 

3.代码中的前后向传播

根据课堂中所教内容可以在代码中实现以下代码

前向传播:

def linear_forward(X,parameters):
    """
    向前传播 + 激活
    :param X:
    :param parameters:
    :return A2:
    :return A_cache: 缓存
    """
    # 数据接收
    W1 = parameters["W1"] 
    b1 = parameters["b1"]
    W2 = parameters["W2"]
    b2 = parameters["b2"]
    # 向前传播并激活
    Z1 = np.dot(W1, X) + b1
    A1 = np.tanh(Z1)
    Z2 = np.dot(W2, A1) + b2
    A2 = sigmoid(Z2)

    A_cache = {"A1": A1,
               "A2": A2}

    return A2, A_cache

反向传播:

def linear_backward(parameters,A_cache,X,Y):
    """
    向后传播,计算梯度
    :param parameters:
    :param A_cache:
    :param X:
    :param Y:
    :return grads: 字典 - dW1,db1,dW2,db2
    """
    m = X.shape[1]

    W1 = parameters["W1"]
    W2 = parameters["W2"]

    A1 = A_cache["A1"]
    A2 = A_cache["A2"]

    dZ2 = A2 - Y
    dW2 = (1 / m) * np.dot(dZ2, A1.T)
    db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
    dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
    dW1 = (1 / m) * np.dot(dZ1, X.T)
    db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)

    grads = {"dW1": dW1,
             "db1": db1,
             "dW2": dW2,
             "db2": db2}

    return grads

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值