写在前面
机器学习是一个很有意思的方向。但是机器学习离不开数学,在你解决下面题目的过程中,希望你能够理解在背后的数学知识。这些题目的本质都是数学相关的分析,请不要舍本逐末。遇到不懂的地方希望你可以自己学习。祝你能够在下面的题目中学有所得。期待你加入 SynX。
注 :所有题目凡是不需要代码的(如画图,概念讲述)请一律写在markdown文件中,凡是需要代码与文字结合描述的,请以.ipynb文件的形式提交,涉及到结果提交的,请在你的本地运行后再提交,不要清除代码块的运行结果,你的代码应该有良好的注释说明。有特殊提交要求的会在题目下说明。题目下的要求优先级高于本条要求。
0. 提交要求
- 使用 Git 管理代码,并使用 SynX GitLab 托管平台账号提交答案。自行组织 Git 仓库的结构。
- 每个 Git 仓库都应有一个 README 文档,其中包括该仓库的基本内容以及题目与目录结构的对应关系。也可以参考如下 README 文档模板写出更漂亮的 README。
- 对于问答题,请使用 Markdown 格式的文档提交答案;对于编程题,在提交代码的基础上,为其编写Markdown 格式的文档,写出该题目的基本思路及运行结果。
- 不要求做完所有题目,欢迎对软件工程感兴趣或学有余力的同学积极探究。无法完全解答的题展示思路即可。
1. 梯度下降
你在高中一定学过导数的概念,使用导数求极值是一个十分方便快捷的过程,但是计算机并不能直接计算出一个方程的0解,请看第一题
1.1 求函数零点
x^2+x-12
请你求出这个方程的小于0的零点(不要直接用求根公式,因式分解等数学方法,以x = -1为起点)- 相信你通过第一题,或多或少有了点使用渐渐逼近的思维,但是也许你会发现单一的使用渐渐逼近的思想似乎只能找到一个零点。
- 我们都知道二次函数的两个解分布在对称轴的两侧,找到了对称轴我们就能找到另一边的解,所以,请你从上一题的零点处出发找出对称轴的x值(tips:如果你发现你的步伐已经走到对称轴右边了,你可以结合 对称轴左右两侧的导数正负值来思考一下该怎么做)
- 通过前面的题目。你应该对梯度下降有了一个初步的认知,现在就用它来解决一些实际的问题。
PS:本题也可以使用二分的方法来进行解决(虽然已经非常典了,欢迎在提交文件中写下你的解法hhh
1.2 线性回归拟合数据
SynX的小远是一个爱思考的同学,一天,他得到了一堆数据,虽然这些数据看似杂乱无章,但是小远同学隐约发现了一些规律,他认为这些数据大致是符合一种线性关系的。但具体是哪种,小远并不知道,他现在有一个初始的线性函数
你能帮助小远找到最佳的拟合函数吗?y=w*x+b
`现在
`w=0,b=0
data
data.csv包含这些数据,请你帮助小远给出一条直线去尽可能拟合这些数据(1000次逼近就行,请将步长设为0.01,要有实现代码)
要求:
- 评判拟合效果请使用这个式子,你所需要做的就是尽可能地使这个式子的值更小
Loss = \sum(\frac{1}{2n})(y_{pre} - y)^2
- 在这道题目中,请你将你的用来计算梯度的函数封装好命名为gradient_compute,该函数只实现计算梯度的功能,返回值为d_Loss/d_w与d_Loss/db(w和b在此处的梯度)
- 在迭代训练途中请将训练精度train_acc和训练损失train_loss进行保存,训练结束后绘制出随迭代次数变化的图像(两条曲线画在一起)
- 最后请将拟合出的直线和原有数据点展示在图片中,例如这样:
1.3 提交要求
- 请将本题文件夹命名为“梯度下降”,可以附带记录你学习和解决问题过程的markdown文件,我们希望看见你的思考。
- 请将求解两个零点的文件命名为zero-point.py并放入文件夹中。
- 请将线性拟合的文件命名为linear_regression.py或linear_regression.ipynb并放入文件夹中。
PS:
-
请使用python中的numpy库,这会大大减少你用于计算的时间,最后的
应该在0左右,误差不会很大\omega
`应该在1.0左右
`b
-
在编写代码的途中,我们推荐你使用jupyter notebook,这样能使你的代码模块更清晰
-
将data.csv进行数据提取时需要用到一点点pandas的操作,绘图可以使用matplotlib
-
我们大部分都知道海贼王里的路飞有橡胶果实,宇智波带土被叫做虚化狗,元流之子是一个数值很高的英雄,那维莱特能转圈,大宝加上古锭刀能打3滴,而不知道维吉尔的椅子并不是塑料做的。这说明总是会有数据不能很好的被我们计算的直线所拟合,而往往我们拟合的直线对于已知的数据又有很好的效果。于是便有种情况叫做过拟合,尤其是当数据量很少的时候很容易发生过拟合,这里由于编者比较懒,给不出更多的数据,不妨取[10,8]和[7.2,4.5]为测试集,其他的为训练集。然后运用一种方法,尽可能地减少过拟合的可能(要写在代码里,并且要配以文字说明你用的什么方法和你的思路)
二、神经网络
2.1 神经网络初步
这里有一个两层的神经网络,第一层有三个神经元,第二层有一个神经元,请你自行查询计算图的定义,然后使用mermaid语言来绘制计算图(矩阵乘法用"@"表示)
提交要求:在markdown文档中绘制计算图
2.2 神经元属性
- 仅可额外使用numpy库,写一个神经元类neuron,并实现neuron的forward()方法(即神经元内的运算然后输出结果)。要求:神经元属性bias和weight不能少,假定所给的数据只有两个特征(诸如x = [0,1]此类)。以sigmoid为激活函数(激活函数请自行实现):
- 仅可额外使用numpy库,使用上面你自己实现的神经元写出一个小的网络(你要自己实现网络这个类):输入层有两个神经元,输出层有一个神经元,没有隐藏层。这个网络只需要能够计算给定数据的预测值就行。
- (加分项)在此基础上利用你在前一问学习的梯度下降来更新神经元参数
2.3 试试你的第一个神经网络
你已经在前面实现了矩阵的乘法计算,梯度下降更新参数,已经可以创建自己的一个简单的神经网络了。MNIST是一个小型的手写数字识别数据集。请你从0创建自己的手写数字分类神经网络。在MNIST上训练。(不要当一个调包侠)用一个简单的流程图来描述你的思路,并配上你的神经网络、梯度更新参数器、结论的代码
你可能要学习:softmax,crossentrofyloss
(加分项:写出计算准确率的函数,写出能够精美展示data与label的函数等等,并将其运用在你的代码中)
本题允许你使用torch tensorflow等框架来快速构建,不过使用太多高级api你可能会被更严格的拷打(doge)
[] Tips:如何使用高级api?你可能需要学一些torch的基础知识,我们当然鼓励你只用numpy这种基本的库来构建神经网络,但是这可能会耗费很多时间。所以我推荐使用torch来实现上述需要的功能,如梯度下降,损失函数等。torch中有这些功能的简单实现,但是我们更希望你能构建自己的版本
2.4 提交要求
- 请将本题文件夹命名为“神经网络”,可以附带记录你学习和解决问题过程的markdown文件,我们希望看见你的思考。
- 请将本题所需markdown文件和代码放入文件夹中。
三、标准化
- 你是否注意到,上述的题目中都没有对数据进行过处理?如果不有效处理数据,很有可能无法得到预期结果。请你自行BN与LN的计算方式并实现。
- 使用你的标准化函数再次的标准化上述mnist数据集并使用上一题的模型训练,使用相关函数记录从训练开始到训练结束所使用的时间。并比较准确率,看看结果如何。
- (加分项)使用svm(可以是个简单的svm)基于MNIST训练模型,对比svm和上题中你的模型训练的时间,预测相同数量的时间,说说看你的看法。
- 将你上一题的模型的层数提高多一点,你可以将模型改成15层,12层(不推荐改太多层,训练慢)。看看会发生什么?请你自己按照mnist数据集中的文件格式自己画一个数字,预测的结果是什么样子的?请在提交的ipynb文件中记载你观察到的事以及结果(不清除ipynb文件的输出即可)(从多个方面回答,训练时间,参数量,准确率.....,涉及到对比的请po出数据及其对应的位置)
- 针对上面你所发现的问题,你有什么改进方法?请提交你的改进代码并加以文字描述
- 总结你所学到的知识,本小问以markdown形式提交。
3.1 提交要求
- 请将本题文件夹命名为“标准化”,可以附带记录你学习和解决问题过程的markdown文件,我们希望看见你的思考。
- 请将本题所需markdown文件和代码放入文件夹中。
四.ResNet探索
任务一
背景:2015年resnet横空出世,直接斩获ImageNet和COCO比赛的五项第一,并有一次刷新了CNN模型在ImageNet上的历史,而ResNet的第一作者何恺明也因此摘得CVPR2016的最佳论文奖
那么ResNet为何能取得如此好的成果,大家不妨阅读该篇论文
Deep Residual Learning for Image Recognition
跟着这几个问题去思考
- ResNet是在什么背景下提出的,在ResNet之前的网络有什么特点或者他们遇到了哪些问题,而ResNet又是解决了哪些问题
- ResNet是怎么解决这个问题的,可以描述一下该解决方案背后的原理吗?
- 在该篇论文中,作者还提出了一种方案修改了Bottleneck从而使ResNet更深,你能描述一下吗?
阅读完该篇论文,我希望你能在该题的文件夹中resnet.py复现出ResNet34和ResNet50(在文件中合理定义Bottleneck会使你的代码更有逻辑性)
任务二
使用你在上题中的ResNet34和ResNet50对以下数据集进行预测(也可以使用torch自带的ResNet模型,不过得先完成前面的任务)
https://www.kaggle.com/datasets/misrakahmed/vegetable-image-dataset
该数据集中有15种蔬菜种类,请为每个训练集(train),测试集(test),验证集(vaild)建一个映射关系的文件(.csv),请使用训练集和测试集对模型进行训练。
在使用该模型时,我希望你能完成以下要求:
- 为加强模型的鲁棒性,请在训练时对图像进行一定程度的预处理,包括翻转,亮度增强,添加一定程度的随机噪音......
- 选择几种(两种以上)你喜欢的蔬菜类别,计算出这几种蔬菜的F1score,并绘制出其的ROC/AUC曲线(横坐标是迭代次数)
- 对测试集进行精度测试(精度测试方法:正确预测的图片数/总的图片数),分别打印出使用Resnet34和Resnet50的测试精度。
提交方式:ResNet.zip文件
包含内容:1.resnet.py
2.train.csv
3.test.csv
4.vaild.csv
5.vegetable_classification.py
6.论文学习笔记和运行结果截图
五、LLM学习
请结合一些OpenAI的技术报告和博客,总结出大语言模型从零开始,到运用到下流任务的全流程,并总结出每个阶段所用的一些算法。
不要求每一个算法都了解其具体细节,希望能总结一个全局观,请将你的学习成果写入markdown文件(不要将网上的内容简单的复制粘贴,不然面试会严重拷打的QAQ。
请在文件夹”LLM学习“中放入该markdown文档
参考资料:
可以多多参考网上的技术博客
LLama3.1最新的技术报告
LLama3.1
OpenAI关于一些常见算法的技术报告
六、Tensor
- 请你讲一讲什么是张量,为什么机器学习中不使用标量而要使用张量代替?
- 你是怎么理解张量的?
- 请你实现一个不完整的张量类,要求实现张量(最多4维)与一维张量,标量的加法。
- 你能想到哪几种数据形式?你觉得他们应该怎么用张量表示?
0 条评论