教新手如何教深度学习者微积分

两个月前,我写了一篇关于向深度学习者教授微积分.我们用了一个下午的时间在SIAM年会上的MathWorks展台上为这个帖子编写了代码。那天早些时候,麻省理工学院(MIT)吉尔·斯特朗(Gil Strang)教授在受邀演讲时,不由自主地想知道,是否有可能向一个深度学习的计算机程序教授微积分。我们展台上的人都不是深度学习方面的专家。

但MathWorks确实有深度学习方面的专家。当他们看到我的帖子时,他们毫不犹豫地提出了一些重要的改进意见。特别是,我们MathWorks英国办公室的Conor Daly为下面的文章贡献了代码。Conor接受了Gil的挑战,开始了学习衍生品的过程。

我们将使用两种不同的神经网络,卷积神经网络,经常用于图像,和循环神经网络,经常用于声音和其他信号。

导数更像图像还是声音?

内容

函数及其导数

这是我们要考虑的函数和导数。

F = {@(x) x, @(x) x.^2, @(x) x.^3, @(x) x.^4,...@(x) sin(x), @(x) cos(x)};dF = {@(x) ones(size(x)), @(x) 2*x, @(x) 3*x。^ 2, @ (x) 4 * x ^ 3。...@(x) pi.*cos(pi.*x), @(x) -pi*sin(pi . x)};Fchar = {“x”“x ^ 2”“x ^ 3”“x ^ 4”“罪(\πx)”“因为(\πx)”};dFchar = {' 1 '“2 x”“3 x ^ 2”' 4 x ^ 3 '“\πcos (x \π)””——\π罪(\πx) '};

参数

设置一些参数。首先,随机数生成器的状态。

rng (0)

在[- 1,1]上生成均匀随机变量的函数。

Randu = @(m,n) (2*rand(m,n)-1);

一个函数产生随机的+1或-1。

Randsign = @()符号(randu(1,1));

函数的个数。

m =长度(F);

重复的次数,即独立观察的次数。

n = 500;

区间内的样本数。

nx = 100;

白噪声水平。

噪音=措施;

训练集

生成训练集预测器X和反应T

X = cell(n*m, 1);T = cell(n*m, 1);J = 1:n x = sort(randu(1, nx));I = 1:m + (j-1)*m;%预测器是x,一个来自-1、1和+/- f(x)的随机向量。胡志明市= randsign ();{k} = [X;胡志明市* F{我}(x) +噪声* randn (nx)];%响应是+/- f'(x)T {k} =胡志明市* dF{我}(x) +噪声* randn (nx);结束结束

将训练集与测试集分离。

idxTest = ismember(1:n*m, randperm(n*m, n));XTrain = X(~idxTest);TTrain = T(~idxTest);XTest = X(idxTest);= T(idxTest);

选择一些测试指标进行绘图。

iTest = find(idxTest);idxM = mod(find(idxTest), m);idxToPlot = 0 (1, m);k = 0:(m-1) im = find(idxM == k);如果k == 0 idxToPlot(m) = m(1);其他的idxToPlot (k) = im (1);结束结束

卷积神经网络(CNN)

为CNN重新格式化数据。

[XImgTrain, TImgTrain] = iConvertDataToImage(XTrain, TTrain); / /显示图像[XImgTest, TImgTest] = iConvertDataToImage(XTest, TTest);

以下是CNN架构的各个层次。请注意,“ReLU”,或“整流线性单位”,使我在以前的帖子中感到如此自豪的,已经被更合适的取代了“leakyRelu”,它并没有完全去除负值。

层= [...imageInputLayer ([1 nx 2],“归一化”“没有”)卷积2dlayer ([1 5], 128,“填充”“相同”) batchNormalizationLayer() leakyReluLayer(0.5)卷积2dlayer ([1 5], 128,“填充”“相同”) batchNormalizationLayer() leakyReluLayer(0.5)卷积2dlayer ([1 5], 1,“填充”“相同”) regressionLayer ()];

以下是CNN的选项。解算器是“个”,即“带动量的随机梯度下降”。

选择= trainingOptions (...“个”...“MaxEpochs”30岁的...“阴谋”“训练进步”...“MiniBatchSize”, 200,...“详细”假的,...“GradientThreshold”, 1...“ValidationData”, {XImgTest, TImgTest});

火车CNN

培训网络。这在我的笔记本电脑上需要3分钟多一点。我没有GPU。

convNet = trainNetwork(XImgTrain, TImgTrain, layers, options);

情节的测试结果

这里是随机选择的结果图。y轴上的极限被设置为理论上的最大值和最小值。6个图中有3个的符号被翻转。

PImgTest =事先。预测(XImgTest);K = 1:m subplot(3,2, K);图1:idxToPlot(1,:, 1, idxToPlot(k))“。”) plot(XImgTest(1,:, 1, idxToPlot(k)), PImgTest(1,:, 1, idxToPlot(k))),“o”)标题(“(”Fchar {k}”)= 'dFchar {k}]);开关k情况下{1,2},集(gca),“ylim”(2 - 2))情况下{3、4},集(gca),“ylim”(k - k),“ytick”(0 k - k))情况下{5、6},集(gca),“ylim”(π-π),“ytick”(π-π0),...“yticklabels”,{' - \π' 0 '“\π”})结束结束

递归神经网络

以下是RNN体系结构的各层,包括“bilstm”即“双向长短期记忆”。

层= [...sequenceInputLayer(2) bilstmLayer(128) dropoutLayer() bilstmLayer(128) fulllyconnectedlayer (1) regressionLayer()];

以下是RNN的选项。“亚当”不是首字母缩写;它是自适应矩估计的随机梯度下降的推广。

选择= trainingOptions (...“亚当”...“MaxEpochs”30岁的...“阴谋”“训练进步”...“MiniBatchSize”, 200,...“ValidationData”{XTest, tt},...“详细”假的,...“GradientThreshold”1);

火车RNN

培训网络。这在我的机器上花了将近22分钟。我真希望我有个GPU。

recNet = trainNetwork(XTrain, TTrain, layers, options);

情节的测试结果

pt = recNet。预测(XTest);K = 1:m subplot(3,2, K);情节(XTest {idxToPlot (k)} (1:), tt {idxToPlot (k)} (1:)“。”)情节(XTest {idxToPlot (k)} (1:), pt {idxToPlot (k)} (1:)“o”)标题(“(”Fchar {k}”)= 'dFchar {k}]);开关k情况下{1,2},集(gca),“ylim”(2 - 2))情况下{3、4},集(gca),“ylim”(k - k),“ytick”(0 k - k))情况下{5、6},集(gca),“ylim”(π-π),“ytick”(π-π0),...“yticklabels”,{' - \π' 0 '“\π”})结束结束

转换数据到CNN格式

函数[XImg, TImg] = iConvertDataToImage(X, T)%转换数据到CNN格式%重新格式化数据为CNNX = cat(4, X{:});XImg = permute(XImg, [3 2 1 4]);TImg = cat(4, T{:});TImg = permute(TImg, [3 2 1 4]);结束

结论

我以前教微积分。我一直对微积分的教学和学习方式持批评态度。下面是一个典型的场景。

教练x^4$的导数是什么?

学生: 4 x ^ 3美元。

教练:为什么?

学生你把这4美元放在前面,然后减去1得到3美元,然后把它代替4美元…

恐怕我们就在这里。学习者只是在寻找模式。没有意义速度加速度,或变动率.微分不在训练集中的表达式的机会很小。没有乘法法则,没有链式法则,没有微积分基本定理

简而言之,几乎没有理解.但也许这是对机器学习的批评。




发布与MATLAB®R2018b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。