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

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

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

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

衍生品更像图像还是声音?

内容

函数及其导数

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

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) *cos(*x), @(x) - *sin(*x)};Fchar = {“x”“x ^ 2”“x ^ 3”“x ^ 4”“罪(\πx)”“因为(\πx)”};dFchar = {' 1 '“2 x”“3 x ^ 2”' 4 x ^ 3 ''\ cos(\pi x)''-\pi sin(\pi x)'};

参数

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

rng (0)

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

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

生成随机+1或-1的函数。

Randsign = @() sign(randu(1,1));

函数的数量。

m =长度(F);

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

N = 500;

区间内的样本数。

Nx = 100;

白噪音水平。

噪声= .001;

训练集

生成训练集预测器X以及他们的反应T

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

将训练集与测试集分开。

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

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

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

卷积神经网络(CNN)

为CNN重新格式化数据。

[xgtrain, TImgTrain] = iConvertDataToImage(XTrain, TTrain);[XTest, TImgTest] = iConvertDataToImage(XTest, TTest);

下面是CNN的架构层。注意“ReLU”,或“整流线性单元”,我在我以前的帖子中引以为傲的已经被更合适的取代了“leakyRelu”,它不会完全切断负值。

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

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

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

火车CNN

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

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

小区试验结果

这里是随机选择的结果图。y轴上的限制设置为理论最大值和最小值。六个图中有三个的符号颠倒了。

PImgTest = convNet。预测(XImgTest);K = 1:m subplot(3,2, K);plot(XImgTest(1,:, 1, idxToPlot(k)), TImgTest(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”,[-k 0 k])情况下{5、6},集(gca),“ylim”(π-π),“ytick”,[- 0],“yticklabels”, {' - \π' 0 '“\π”})结束结束

循环神经网络(RNN)

下面是RNN架构的层,包括“bilstm”意思是"双向长短期记忆"

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

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

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

火车RNN

训练网络。这在我的机器上花了差不多22分钟。它让我希望我有一个图形处理器。

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

小区试验结果

PTest = 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”,[-k 0 k])情况下{5、6},集(gca),“ylim”(π-π),“ytick”,[- 0],“yticklabels”, {' - \π' 0 '“\π”})结束结束

将数据转换为CNN格式

函数[xig, TImg] = iConvertDataToImage(X, T)%将数据转换为CNN格式%为CNN重新格式化数据xm = cat(4, X{:});xm = permute(xm, [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帐户或创建一个新帐户。