吴恩达机器学习笔记三
目录
对前面的内容进行补充:
损失函数和成本函数是一个递进的关系。
损失函数是针对单个训练样本,成本函数是针对全局的训练样本。梯度下降的计算逻辑——分别对成本函数的 w 和 b 偏导,而计算这个偏导时,需要先用到单个样本的损失。
“先借损失算成本,再对成本求偏导”
1.【正向计算】阶段:当前的参数w和b,对每个样本计算预测值y^(i),再通过损失函数计算每个样本的误差L(y^(i),y(i)),并聚合为全局的成本函数J(w,b)—— 这一步是 “从参数到成本的正向传递”,为后续优化提供 “误差基准”。
2.【反向求导与参数更新】阶段:梯度下降的核心是通过反向求导,计算成本函数J(w,b)分别对w和b的偏导数;计算这两个偏导时,必然依赖单个样本损失的链式求导。
例如对w的偏导
,需先求出每个样本损失对w的局部导数,再平均得到全局梯度)。
3.【参数迭代优化】阶段:得到
和
后,按 “梯度反方向” 更新参数
(
α为学习率),让成本函数J(w,b)向最小值靠近。
通过 “正向算成本→反向求梯度→迭代更参数” 的循环,模型会逐步找到使成本函数最小化的
w和b,此时模型在整个训练集上的全局误差最小,完成从 “初始参数” 到 “最优参数” 的优化过程。
#############################################################################
1、神经网络
特点:可以自行学习隐藏层的特征。

上图为面部识别的例子,输入层为:1000x1000像素网络(像素强度矩阵),将其转为10000000的特征向量为列向量作为输入层

上图为神经网络的工作过程,每个隐藏层中包含多个神经元,第一个隐藏层识别边缘短小的线条;第二个隐藏层识别眼鼻等面部细节;第三层识别整个面部并进行对照;最后输出层进行识别结果输出。整个过程自动进行学习。
激活函数引言

上图为相对复杂的神经网络,其中每个神经元都要对上一层输出的激活值(向量)进行处理,即通过激活函数进行,本次使用的激活函数为sigmoid函数(g(z)=wa+b)
【正向传播】:激活函数只是用于输出这些激活值的函数,各层的每个神经元都经过激活函数的处理输出一个激活值,每层的全部激活值集合起来作为下一层的输入值。
在数字识别代码中举例说明此过程:(输入值为像素值的列向量x)
x = np.array([[0.0,...245,...240,...0]])这行代码中用到了两个方括号,表示这是一个一行 很多列的矩阵,里面的方括号[]表示一行,外面的方括号[]表示所有行合起来的矩阵(为多维矩阵)。
x = np.array([[0.0,...245,...240,...0]])
# Dense表示全连接,第一个隐藏层有25个神经元(单元),每个神经元的激活函数为sigmoid
layer_1 = Dense(units = 25,activation = 'sigmoid')
a1 = layer_1(x)
# Dense表示全连接,第二个隐藏层有15个神经元(单元),每个神经元的激活函数为sigmoid
layer_2 = Dense(units = 15,activation = 'sigmoid')
a2 = layer_2(a1)
# Dense表示全连接,第三个隐藏层有1个神经元(单元),每个神经元的激活函数为sigmoid
layer_3 = Dense(units = 1,activation = 'sigmoid')
a3 = layer_3(a2)
# 判断最后输出的值
if a3 >= 0.5
yhat = 1
else:
yhat = 0

2、TensorFlow
TensorFlow 和 NumPy 都是 Python 中用于数值计算的重要工具。
两者都以多维数组(张量) 作为核心数据结构。
两者常结合使用:用 NumPy 进行数据加载和预处理,再将数据传入 TensorFlow 构建的模型中训练和推理。

3、在TensorFlow中构建神经网络
下面我们将第一节的例子用TensorFlow进行细化:

# 构建由三个隐藏层构成的神经网络
layer_1 = Dense(units = 25,activation = "sigmoid")
layer_2 = Dense(units = 15,activation = "sigmoid")
layer_3 = Dense(units = 1,activation = "sigmoid")
model = Sequential([layer_1, layer_2, layer_3])
model.compile(...) # 配置模型的训练参数,必须指定的关键参数包括:
# optimizer:优化器(如 adam、sgd),用于更新模型参数。
# loss:损失函数(如 binary_crossentropy 用于二分类,mse 用于回归),衡量预测值与真实值的差距。
# metrics:评估指标(如 accuracy 准确率),用于监控训练过程。
# #####################################################################
# 也可以简化为
import tensorflow as tf
from tensorflow.keras import Sequential #用于按顺序堆叠神经网络层
from tensorflow.keras.layers import Dense #全连接层类
model = Sequential([
Dense(units = 25,activation = "sigmoid"),
Dense(units = 15,activation = "sigmoid"),
Dense(units = 1,activation = "sigmoid")
])
model.compile(...)
# 将训练的数据集导入
x = np.array([[0...,245,...,17]
[0...,200,...,184]])
y = np.array([1,0]) # y表示训练数据x的标签数据是一个一维数组,因此只有一组方括号[],即对应x的第一行数据为1,x的第二行数据为0
# 进行模型训练
model.fit(x,y)
# 对新值进行模型预测
model.predict(x_new)
前向传播的具体代码过程:

其中w1_1的第一个数字代表第几个隐藏层,第二个参数代表该隐藏层中的第几个参数
将前向传播的过程封装为函数可得到:

import numpy as np
# 定义sigmoid激活函数
def g(z):
return 1 / (1 + np.exp(-z))
# 定义全连接函数
def dense(a_in,W,b): # a_in为上一层输出的激活值,作为本次的输入值,b为本隐藏层的偏置,W大写的为权重矩阵(为本隐藏层中所有权重w构成的矩阵,每列对应一个权重w向量值)
units = W.shape[1] # 大写的W.shape表示矩阵的形状(本例为2行3列=2x3),W.shap[1]表示为列数3,及单元数/神经元数3个,W.shap[0]表示为行数2,W 的维度是 (输入特征数, 神经元数)
a_out = np.zeros(units) # 设置输出值,初始化为3个单元均为0的向量
for j in range(units): # 0 1 2
w = W[:,j] # 按列遍历 , 取第j个神经元的权重向量
z = np.dot(w,a_in) + b[j] # 列向量w与输入向量值点乘+b,计算加权和+偏置
a_out[j] = g(z) # g()为sigmoid函数
return a_out
# 假设已有预定义的权重和偏置参数(W1,b1,W2,b2,W3,b3,W4,b4)
def sequential(x):
a1 = dense(x,W1,b1) # W为大写的w列向量组成的矩阵,a1为第一层输出向量值
a2 = dense(a1,W2,b2)# a2为第二层输出向量值
a3 = dense(a2,W3,b3)# a3为第三层输出向量值
a4 = dense(a3,W4,b4)# a4为第四层输出向量值
f_x = a4
return f_x
对上述代码进行优化:用矩阵乘法实现全连接代码

AT = np.array([[200, 17]]) # 双方括号表明为二维矩阵,AT表明是A矩阵的转置
W = np.array([[1, -3, 5] # W为权重矩阵
[-2, 4, -6]])
b = np.array([[1, 1, 2]]) # b为偏置矩阵
def dense(AT, W, b):
z = np.matmul(AT,W) + b # matmul为numpy的矩阵乘法
a_out = g(z) #g()为sigmoid激活函数
return z_out
4、模型训练代码流程
逻辑回归和神经网络下的TensorFlow的对比,如下图:

【逻辑回归训练模型】
1.前向传播得到预测值fw,b(x)

2.计算损失loss函数和成本cost函数
损失函数:单个训练样本的函数![]()
成本函数:整个训练集上的损失函数的平均值![]()
3.使用梯度下降来最小化成本函数
更新参数w和b来实现最小化成本函数![]()
【神经网络训练模型】
1.前向传播得到输出值

2.计算损失loss函数和成本cost函数
编译模型并指定使用的损失函数(本例为二分类模型——二元交叉熵损失函数)
这里的损失函数仍与逻辑回归的损失函数相同![]()
不过要在开头加入
# 交叉熵损失函数
from tensorflow.keras.losses import BinaryCrossentropy
# 均方误差损失函数
from tensorflow.keras.losses import MeanSquaredError

指定损失函数后,模型会直接计算出神经网络的成本函数
当指定为loss:二元交叉熵损失函数时(逻辑回归问题)![]()
——成本函数为cost:![]()
当指定为loss:均方误差损失函数(线性回归问题)![]()
——成本函数为cost:
这里的成本函数为
权重W矩阵和偏置B矩阵
3.反向传播来最小化成本函数
这步的操作封装在TensorFlow中,直接调用model.fit()函数可直接使用:(迭代100次)
![]()
更多推荐



所有评论(0)