教新手如何教深度学习者微积分
两个月前,我写了一篇关于向深度学习者教授微积分.我们用了一个下午的时间在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美元…
恐怕我们就在这里。学习者只是在寻找模式。没有意义速度,加速度,或变动率.微分不在训练集中的表达式的机会很小。没有乘法法则,没有链式法则,没有微积分基本定理.
简而言之,几乎没有理解.但也许这是对机器学习的批评。
评论
要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。