UFLDL新版教程与编程练习(十):RICA(重建独立成分分析)

UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!

我这里找不到新版对应这块的中文翻译了,-_-,这是倒数第2个练习了,就快完了!
第十节是:RICA(重建独立成分分析)
教程上说:RICA是为了克服ICA的正交性限制,而它的惩罚项不像ICA那么“严厉”,要减小的损失函数变为:
min ⁡ W λ ∥ W x ∥ 1 + 1 2 ∥ W T W x − x ∥ 2 2 \min _{W} \quad \lambda\|W x\|_{1}+\frac{1}{2}\left\|W^{T} W x-x\right\|_{2}^{2} WminλWx1+21WTWxx22
前一项为惩罚项,后一项还是衡量编码后的与原来的差异。
现在我们要来计算梯度,损失函数有两项,所以要计算这两项对参数 W W W的梯度,首先看 ∥ W T W x − x ∥ 2 2 \left\|W^{T} W x-x\right\|_{2}^{2} WTWxx22,可以从下面的图里面慢慢推出 ∇ W ∥ W T W x − x ∥ 2 2 \nabla_{W}\left\|W^{T} W x-x\right\|_{2}^{2} WWTWxx22
编码器前向传播
这是我的笔记中关于这个的推导:
笔记推导1
我们有了误差 δ \delta δ和该层的输入,就可推出梯度:
∇ W F = ∇ W F + ( ∇ W T F ) T = ( W ) ( 2 ( W T W x − x ) ) x T + 2 ( W x ) ( W T W x − x ) T \nabla_{W} F =\nabla_{W} F + (\nabla_{W^{T}} F)^{T}\\ = (W)(2(W^{T}Wx -x)) x^{T} + 2(Wx)(W^{T}Wx - x)^{T} WF=WF+(WTF)T=(W)(2(WTWxx))xT+2(Wx)(WTWxx)T
对于 λ ∥ W x ∥ 1 \lambda\|W x\|_{1} λWx1这一项,我们是用 f ( x ) = x 2 + ϵ f(x) = \sqrt{x^2 + \epsilon} f(x)=x2+ϵ 这种模式来模拟1-范数,也可以求得对 W W W的梯度,可以在我的笔记中找到(结论就是下面的红框里面标出来的):
笔记推导2
好了现在可以放代码了:

zca2.m

function [Z] = zca2(x)
epsilon = 1e-4;
% You should be able to use the code from your PCA/ZCA exercise
% Retain all of the components from the ZCA transform (i.e. do not do
% dimensionality reduction)

% x is the input patch data of size 81*10000
% z is the ZCA transformed data. The dimenison of z = x.

%%% YOUR CODE HERE %%%
avg = mean(x, 1);     % Compute the mean pixel intensity value separately for each patch. 
x = x - repmat(avg, size(x, 1), 1);
sigma = x * x' / size(x, 2); % covariance matrix
[U,S,~] = svd(sigma);
xRot = U' * x;          % rotated version of the data.
Z = U * diag(1./sqrt(diag(S) + epsilon)) * xRot;

softICACost.m

%% Your job is to implement the RICA cost and gradient
function [cost,grad] = softICACost(theta, x, params)

% unpack weight matrix
W = reshape(theta, params.numFeatures, params.n); % 50*81

% project weights to norm ball (prevents degenerate bases)
Wold = W;
W = l2rowscaled(W, 1);

%%% YOUR CODE HERE %%%
% cost Wgrad
lambda = 0.1; % 这是我实验过后比较好的
epsilon = 1e-2;
cost = lambda * sum(sum(sqrt((W*x).^2+epsilon))) + sum(sum((W'*W*x-x).^2)) / 2 ;
% Wgrad = lambda * (W' * W * x./sqrt((W*x).^2+epsilon))+ W * (W' * W * x - x) * x' + W * x * (W' * W * x - x)';
Wgrad = lambda * (W*x./sqrt((W*x).^2+epsilon))*x'+ W * (W' * W * x - x) * x' + W * x * (W' * W * x - x)';

% unproject gradient for minFunc
grad = l2rowscaledg(Wold, W, Wgrad, 1);
grad = grad(:);

运行结果:
运行runSoftICA.m
runSoftICA.m运行结果
对权值矩阵进行可视化:可以看出这是一个边缘检测器
penstrokes
有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizi_laizi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值