首页 > 解决方案 > 如何提高 Julia the Storkey 的学习表现?

问题描述

嗨社区我是新来的,在 Julia 1.0.3 中也是新来的。现在我正在研究不同数字系统中的 Storkey 学习规则。在我第一次尝试编码这个想法时,我尝试了这个幼稚的代码:

    function storkey_learning_first(U)
    
    # The memories are given by the columns
    row,col = size(U)
    
    # First W matrix
    W_new = zeros(row,row)
 
    for mu=1:col
        
        W_old = copy(W_new)

        for i=1:row
            for j=i:row 
                s = 0.0
                # Putting this value in the new matrix
                s += U[i,mu]*U[j,mu]
                s -= local_field_opt(W_old,U[:,mu],i,j,row)*U[j,mu]
                s -= local_field_opt(W_old,U[:,mu],j,i,row)*U[i,mu]
                s *= 1/row    
                
                W_new[i,j] += s
                W_new[j,i]  = W_new[i,j]
                
            end  
        end
        
    end

    return W_new
end

这是主要功能和由

function local_field_opt(W_old,U,i,j,row)

hij = 0.0

for k=1:row
    
    if k != i && k != j
    hij += W_old[i,k]*U[k]
    end
    
end
return  hij
end

然后给定一个 n 维实值向量,两个代码都会创建一个维数 (nxn) 的矩阵。对于低维向量是有效的。但是对于高维数组来说真的很慢。事实上,我想存储维度 n = 8192 的向量。此外,我想使用低维复值向量或四元数,但在实际情况下我不能做得更好。在第二次尝试中,我将完整的结构分为两个函数,特别是,我将两个内部循环分开,以避免重复调用相同的元素:

function_inner(U,W_old,W_mu,mu,row)

# Calling one time the column
U_mu = U[:,mu]


for j=1:row
    U_j_mu = U[j,mu]
    
    for i=j:row 
        
        U_i_mu = U[i,mu]
        
        s = 0.0
        
        s += U_i_mu *U_j_mu
        s -= U_i_mu *local_field_opt(W_old,U_mu,j,i,row)
        s -= local_field_opt(W_old,U_mu,i,j,row)*U_j_mu
        s *= 1/row    

        W_mu[i,j] += s
        W_mu[j,i]  = W_mu[i,j]
    end  
end    
return W_mu 
end

有了这个,我获得了几秒钟。在这种特殊情况下如何改进我的语法?以及使用复数或四元数:这应该是一个相当大的额外负担吗?最后,到目前为止,我正在为维度 n=1352 的向量获得这个时间标记:

@time W = RealStorkey.storkey_learning(U,RealStorkey.first) 
349.680284 seconds (268 allocations: 1.376 GiB, 0.09% gc time)

标签: performancejulianested-loopsquaternionscomplex-numbers

解决方案


推荐阅读