美文网首页人工智能/模式识别/机器学习精华专题
UFLDL新版教程与编程练习(十):RICA(重建独立成分分析)

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

作者: 赖子啊 | 来源:发表于2019-08-13 12:11 被阅读1次

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

    我这里找不到新版对应这块的中文翻译了,-_-,这是倒数第2个练习了,就快完了!
    第十节是:RICA(重建独立成分分析)
    教程上说:RICA是为了克服ICA的正交性限制,而它的惩罚项不像ICA那么“严厉”,要减小的损失函数变为:
    \min _{W} \quad \lambda\|W x\|_{1}+\frac{1}{2}\left\|W^{T} W x-x\right\|_{2}^{2}
    前一项为惩罚项,后一项还是衡量编码后的与原来的差异。
    现在我们要来计算梯度,损失函数有两项,所以要计算这两项对参数W的梯度,首先看\left\|W^{T} W x-x\right\|_{2}^{2},可以从下面的图里面慢慢推出\nabla_{W}\left\|W^{T} W x-x\right\|_{2}^{2}

    编码器前向传播
    这是我的笔记中关于这个的推导:
    笔记推导1
    我们有了误差和该层的输入,就可推出梯度:

    对于这一项,我们是用这种模式来模拟1-范数,也可以求得对的梯度,可以在我的笔记中找到(结论就是下面的红框里面标出来的):
    笔记推导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
    有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ejuvjctx.html