- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当人们使用标准交叉熵(softmax损失)时,我尝试运行(随机或批处理)梯度下降:
在将Radial Basis Function (RBF)网络用作模型时(如果需要,可以观看caltech here讲座),可以扩展为多类分类(只需将RBF网络的输出馈送到softmax层即可轻松扩展。请注意<通过将RBF网络的输出通过每个标签P(y=l|x)
的softmax层来简单地计算cc>,如下所示:
其中,l
为负责对标签\theta_l
进行预测的参数建立索引。
在这方面,我想通过计算参数的导数来优化模型。回想一下,在径向基函数网络中要优化的参数是最后一层的权重l
和第一层的中心c
。我已经实现并调试了如何计算权重t
的导数。该代码按预期工作,因为偏导数与数值导数匹配。您可以找到单元测试代码为here。
我还尝试编写关于中心实现导数的代码,但我似乎无法使导数的实现与数值导数相匹配。我正在尝试实现的相对于中心c
的损耗J
的导数公式如下:
其中,t_k
对应于负责预测标签h_{\theta_l}
的RBF的输出。实际上,l
表示非常简单:
我的主要问题是计算相对于h_{\theta_l}
的J
导数(上面的等式)。为此,我实现了following function,可以在不向量化的情况下天真地计算它:
function [ dJ_dt ] = compute_dJ_dt(z,x,y,t,c)
%Computes dJ_dc
% Input:
% z = (K x 1)
% x = data point (D, 1)
% y = labels (1 x 1)
% t = centers (D x K)
% c = weights (K x L)
% Output:
% dJ_dc = (D x K)
[D,K] = size(t);
[~, L] = size(c);
dJ_dt = zeros(D, K);
for k=1:K
dJ_dt_k = zeros(D, 1);
for l=1:L
c_l = c(:,l);
dh_dt_l = compute_dh_dt(z,x,t,c_l); %(D x K)
delta = (y==l);
dJ_dt_k = dJ_dt_k + dh_dt_l(:,k) * delta;
end
dJ_dt(:,k) = -dJ_dt_k;
end
end
t_k
和
c
的偏导数的推导是相同的,并且只更改符号
t
的导数,并且通过了我所有的派生测试,因此我认为关于
\theta
的导数的推导或任何参数
c
应该是正确的。可以在
math.stack exchange here中看到我对这个方程的推导。
t
实际上没有实现我所期望的方程式。确实可能是这样,并检查我是否独立执行了更多的
vectorized version of that code来查看我是否确实在执行我在纸上记下的方程式。由于方程的两个版本输出相同的导数值,因此我非常确信它们正在计算,确实是我怀疑的方程(同样,如果有人能够进一步向量化该方程,那将非常棒!我添加了向量化如此琐碎,以至于看起来似乎没有那么有趣或没有太多性能提升,但是确实删除了一个for循环)。
\theta
的数值导数,并且总是通过
compute_dJ_dt
的数值导数,因此我无法想象
c
是错误的。
c
的计算正确。我已经写了
units tests for dh_dt,并且由于它们在每次运行时都与它们对应的数值导数匹配,所以我怀疑代码是正确的。
最佳答案
这是一种反气候的解决方案,但是我想这是可以预期的,因为此代码似乎是由工作组件构建的,因此注定是一个愚蠢的小错误。错误是我上面粘贴的代码中的错误,我应该一直使用delta
作为标签指示和该标签概率之间的差异,但是我忘了减去概率。所以上面的代码是:
delta = (y==l);
prob_y_x_h_x = prob_y_x(h_x); % (L x 1)
ind_y_l = (y==l);
delta = ind_y_l - prob_y_x_h_x(l);
function [ dJ_dt ] = compute_dJ_dt(h_x,z,x,y,t,c)
%Computes dJ_dc
% Input:
% z = (K x 1)
% x = data point (D, 1)
% y = labels (1 x 1)
% t = centers (D x K)
% c = weights (K x L)
% Output:
% dJ_dc = (D x K)
[D,K] = size(t);
[~, L] = size(c);
dJ_dt = zeros(D, K);
for k=1:K
dJ_dt_k = zeros(D, 1);
for l=1:L
c_l = c(:,l);
dh_dt_l = compute_dh_dt(z,x,t,c_l); %(D x K)
prob_y_x_h_x = prob_y_x(h_x); % (L x 1)
ind_y_l = (y==l);
delta = ind_y_l - prob_y_x_h_x(l);
dJ_dt_k = dJ_dt_k + dh_dt_l(:,k) * delta;
end
dJ_dt(:,k) = -dJ_dt_k;
end
end
function [ dJ_dt ] = compute_dJ_dt_vec(h_x,z,x,y,t,c)
%Computes dJ_dc
% Input:
% z = (K x 1)
% x = data point (D, 1)
% y = labels (1 x 1)
% t = centers (D x K)
% c = weights (K x L)
% Output:
% dJ_dc = (D x K)
[D,K] = size(t);
[~, L] = size(c);
dJ_dt = zeros(D, K);
for l=1:L
c_l = c(:,l);
dh_dt = compute_dh_dt(z,x,t,c_l); %(D x K)
ind_y_l = (y==l);
prob_y_x_h_x = prob_y_x(h_x); % (L x 1)
dJ_dh = repmat( ind_y_l - prob_y_x_h_x(l) , D, K); %(D x K)
dJ_dt = dJ_dt + dJ_dh.*dh_dt;
end
dJ_dt = -dJ_dt;
end
关于matlab - 使用softmax损失时,如何调试和矢量化径向基函数网络的偏导数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224563/
我正在尝试快速创建一个径向 CAGradientLayer。普通 CAGradientLayers(默认类型 axial)没有问题。它们在模拟器中的快照和运行时呈现良好。 当我拍摄我创建的 UIVie
我想用 CSS 制作一个径向进度指示器,它的中间圆圈是透明的。看这里:http://codepen.io/geedmo/pen/InFfd – 这是我想要做的事情的完美示例,但中间 (.overlay
我已经编写了用于生成网络图的 UI、服务器和 global.r。它适用于一种布局(layout.fruchterman.reingold)。我想要一个用于列出布局的单选按钮(径向、对角线网络和 den
我正在使用 jqwidgets。在那些小部件中,我使用的是径向量规。对于那个径向仪表,我想给出径向背景色。我有一个类似这样的代码,用于更改径向仪表中的背景颜色。 $('#gauge').jqxGaug
有谁知道我可以用来为 iOS 应用程序创建饼图(径向)菜单的库(开源或其他)? 看来现在应该有人想到了这一点,如果没有必要,我不愿意自己动手。 最佳答案 我不久前发现的一个。 http://www
我正在使用 this code为我的数据获取径向 TreeMap 。但是,我想修改它以避免弯曲链接。相反,我对线性直接连接感兴趣。弯曲的链接使插图不那么复杂,特别是当我们的子节点数量较少时。例如,您可
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我正在使用 chrome 18.0.1025.162 并尝试进行径向渐变 -webkit-radial-gradient(circle, rgba(100, 100, 100, 0.2), rgba(
我想呈现漂亮的径向树布局,但有点被弯曲的边缘绊倒了。问题是源点和目标点之间的角度不同,边缘的绘制方式也不同。提供的图片来自单个图表,因此您可以看到它们在不同边缘方向上有何不同。我认为关键在于 beiz
我希望我的工具栏使用 Material 设计径向 react 编排指南改变颜色 我想将其实现为 Angular 2 过渡,但我不知 Prop 体该怎么做: 看起来像这样.. @Component({
我目前正在使用以下代码绘制形状; GLfloat vertex = // vertex points glLineWidth(2); glEnableClientState(GL_VERTEX_ARR
我是一名优秀的程序员,十分优秀!