写点什么

ARTS 打卡第 2 周

作者:Johnson
  • 2023-08-27
    江苏
  • 本文字数:2717 字

    阅读完需:约 9 分钟

ARTS 打卡第 2 周

1.A-algorithm

归并排序

 public class AlgMerge {    public static void main(String[] args) {        int[] arr = {4,3,2,6,7,2,1,9,11,2};        mergeSort(arr);

for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+","); } }
public static void mergeSort(int [] arr){ mergeSort(arr,0, arr.length-1); }
public static void mergeSort(int[] arr, int L , int R){ if(arr==null || L==R) { return; } mergeSort(arr, L, L+(R-L)/2); mergeSort(arr, L+(R-L)/2+1,R); merge(arr, L, L+(R-L)/2, R); }
public static void merge(int[] arr, int L , int M , int R){ int left = L; int right = M+1; int [] result = new int[R-L+1]; int i = 0; while (left<=M && right<=R){ result[i++] = (arr[left]<=arr[right])?arr[left++]:arr[right++]; } if(left>M){ while (right<=R){ result[i++] = arr[right++]; } }else if(right > R){ while (left<=M){ result[i++] = arr[left++]; } }

for (int j=0; j<result.length; j++){ arr[L+j] = result[j]; } }}
复制代码


2.R-review

原文:http://karpathy.github.io/2022/03/14/lecun1989/

Yann LeCun et al. (1989) 的论文 Backpropagation Applied to Handwritten Zip Code Recognition 具有一定的历史意义,它是最早通过将反向传播进行端到端训练的神经网络。除了文中使用了微小的数据集(7291 张 16x16 的灰度数字图像)和微小的神经网络(只有 1,000 个神经元),这篇论文在 33 年后的今天读起来依然非常现代——它阐述了一个数据集,描述了神经网络架构、损失函数、优化器,并报告了训练和测试集的实验分类错误率。因此,博客作者复现此论文 1)为了好玩,2)将练习用作深度学习进化本质的案例研究。

1.实现:原始的网络用 lisp 编写的,使用 Bottou 和 LeCun 1988 的反向传播模拟器 SN(后来命名为 Lush),作者用 pytorch 重新实现。现代的 pytorch 库设计为 3 个组件:1) 快速 (C/CUDA) 通用张量库,可在多维张量上实现基本数学运算,2) 跟踪前向计算图并可以生成后向传递操作的 autograd 引擎,以及 3) 可编写脚本的(Python) 深度学习感知, 常见深度学习操作、层、架构、优化器、损失函数等的高级 API。

2.训练:原始网络在 SUN-4/260 工作站上训练了 3 天,作者训练使用的是 Macbook Air(M1)的 CPU,总共花了 90s 训练完成。作者也尝试过在 A100 GPU 上运行代码,但训练实际上更慢,很可能是因为网络太小了。原始数据集已经随着时间的流逝而消失了,而作者不得不使用更大的 MNIST 数据集来模拟原始数据集,操作方法是获取 MNIST 的 28x28 位数字,通过双线性插值将它们缩小到 16x16 像素,并且随机(不会替换)从中绘制正确数量的训练和测试集示例。

3.如果应用往后 30 多年来的 AI 经验和技术进行改进,能提高多少呢?作者删除了输出层上的 tanh 以获取类对数,并交换了标准(多类)交叉熵损失函数。此更改极大地改善了训练误差,完全过度拟合了训练集,为了避免过拟合,作者使用了数据增强、dropout、relu 激活函数等,将错误率降低约 60%。

4.最终,作者进行了总结:

(1)33 年来宏观层面没有太大变化。我们仍在建立由神经元层组成的可微分神经网络架构,并通过反向传播和随机梯度下降来端到端地优化它们。

(2)按照今天的标准,1989 年的数据集只是一个婴儿。今天的视觉数据集通常包含来自网络的几亿张高分辨率彩色图像。

(3)1989 年的神经网络也是一个婴儿:这个 1989 年的网络有大约 9760 个参数,现代(视觉)神经网络的规模只有几十亿个参数。

(4)在 1989 年的工作站上训练需要 3 天时间的最先进的分类器,现在在无风扇笔记本电脑上训练只需 90 秒(3,000 倍加速)。

(5)通过调整模型、增强、损失函数和基于现代研发创新的优化器,能将错误率降低 60%,同时保持数据集和模型的测试时间延迟不变。

(6)仅通过扩大数据集就可以获得适度的收益。

(7)进一步的重大收益可能必须来自更大的模型,这将需要更多的计算和额外的研发,以在不断增加的规模上稳定训练。

作者更进一步的推测,2055 年的时间旅行者会如何看待当前网络的性能?

(1)2055 神经网络在宏观层面上与 2022 神经网络基本相同,只是更大。

(2)我们今天的数据集和模型看起来像一个笑话。会大 1000 万倍

(3)人们可以通过在他们的个人计算设备上进行训练,在 1 分钟内训练 2022 年最先进的模型。

(4)今天的模型不是被公式表示的最佳表达,只需更改模型、损失函数、增强或优化器的一些细节,我们就可以将误差减半。

(5)如果不扩展计算设施并投入研发以更有效的训练这种规模的模型,则不可能获得更大的收益。


3.T-分享一个技术

如果觉得初始化代码全部都写在 SpringConfiguration 一个类中太过于臃肿,我们可以分开写,比如说创建一个 JdbcConfig 专门用来初始化连接池对象;

--总结 一共有两种方法:

(1)在 SpringConfiguration 加上包路径:@ComponentScan({"com.zzq","config"})并且在 JdbcConfig 加上 @Configuration 注解(包在扫描类时,只有确定这个类是配置类,才对里面的注解进行扫描所以加上 @Configuration)缺点:配置太繁琐

(2)不需要加包路径,也不需要加注解,只需要创建实现类时传入字节码文件 ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class, JdbcConfig.class);缺点:这样看起来两个配置类似乎没有大小之分,我们的想法是让 SpringConfiguration 作为最顶层的配置类,然后再给它加一些底层一点的配置类有没有新办法解决上述问题,有新注解 @Import


4.S-分享一个观点/思想

一个老板能让很多人愿意跟随他,绝不是因为他在某个技术上有多厉害,而是他善于给别人构建梦想,让别人对他构建的梦想有期待,有盼头。老板擅长给员工造梦,员工才会有动力,有盼头,更加努力的工作,为公司创造价值的同时,也成就了自己,这是两全其美的事情。太老实人,他没有吹牛画饼造梦的能力,他就无法给员工期待,就激不起员工的动力,他就做不好生意,当不好老板,给不了别人想象空间,就留不住人。无论是处理人际关系,谈恋爱还是做生意,好的,高价值的东西,要让别人知道你有,但一定不要太快给出去,太快释放价值,给予好处,对方就不愿意的出成本,不愿意努力,给予希望和期待,激发出他的饥饿感和欲望,才能实现价值最大化。


#ARTS 打卡计划#

用户头像

Johnson

关注

还未添加个人签名 2019-08-15 加入

还未添加个人简介

评论

发布
暂无评论
ARTS 打卡第 2 周_AI_Johnson_InfoQ写作社区