斯坦福机器学习教程学习笔记之2

本文探讨了机器学习中过拟合问题的解决方案——正则化,并详细介绍了正则化线性回归与逻辑回归的方法。此外,还深入讨论了神经网络的结构与学习过程,包括非线性假设、模型表示及反向传播算法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列其他部分:



第七章 正则化(Regularization)

1.过拟合的问题

正则化(regularization)的技术,它可以改善或者减少过度拟合问题。

过拟合解决办法:(1)减少特征数量,人工选择或使用一些模型选择算法,例如PCA;(2)正则化,保留所有特征,但是减少参数的大小(magnitude)

2.代价函数

假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:

其中λ又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对θ0 进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:

如果选择的正则化参数λ过大,则会把所有的参数都最小化了,导致模型变成 hθ(x)=θ0,也就是上图中红色直线所示的情况,造成欠拟合。

3.正则化线性回归(RegularizedLinear Regression)

正则化线性回归的代价函数为:

梯度下降算法:

可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令θ值减少了一个额外的值。

正规方程:

4.正则化逻辑回归(RegularizedLogistic Regression)

注意:

1.虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的h(x)不同所以还是有很大差别。

2.θ0不参与其中的任何一个正则化。

第八章 神经网络:表述(Neural Networks: Representation)

1.非线性假设(Non-linearHypotheses)

2.神经元和大脑(Neurons andthe Brain)

3.模型表示1 (ModelRepresentation I)

每一个a都是由上一层所有的x和每一个x所对应的决定的。(我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ))。

4.模型表示2(ModelRepresentation II)

我们可以把a0,a1,a2,a3看成更为高级的特征值,也就是x0,x1,x2,x3的进化体,并且它们是由x与决定的,因为是梯度下降的,所以a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将x次方厉害,也能更好的预测新数据。

5.举例和直观理解1(Examples andIntuitions I)

6.举例和直观理解2(Examples andIntuitions II)

7.多类分类(MulticlassClassification)

第九章 神经网络的学习

1.代价函数

假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,Sl表示每层的neuron个数(SL表示输出层神经元个数),SL 代表最后一层中处理单元的个数。

将神经网络的分类定义为两种情况:二类分类和多类分类,

二类分类:SL=1, y=0 or 1表示哪一类;

K类分类:SL=K,yi = 1表示分到第i类;(K>2)


代价函数为:

2.反向传播算法(BackpropagationAlgorithm)

重要的是清楚地知道上面式子中上下标的含义:

l 代表目前所计算的是第几层

j 代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。

i 代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。

3.反向传播算法的直观理解

4.展开参数

5.梯度检验(GradientChecking)

6.随机初始化(RandomInitialization)

到目前为止我们都是初始所有参数为0,这样的

初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。我们通常初始参数为正负ε之间的随机值。

7.综合起来

小结一下使用神经网络时的步骤:

网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络:

1. 参数的随机初始化

2. 利用正向传播方法计算所有的hθ(x)

3. 编写计算代价函数J的代码

4. 利用反向传播方法计算所有偏导数

5. 利用数值检验方法检验这些偏导数

6. 使用优化算法来最小化代价函数

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值