連続ホップフィールド ニューラル ネットワーク
連続ホップフィールド ニューラル ネットワーク (Continuous Hopfield Network、CHN) は、エネルギー最小化の原理に基づいたニューラル ネットワーク モデルであり、離散ホップフィールド ネットワークと比較して、その状態は連続的であり、通常は実数値または確率分布を使用します。連続ホップフィールド ニューラル ネットワークを最適化するときは、次の側面を考慮する必要があります。
-
適切な活性化関数を選択する: 活性化関数は、ニューロンの出力と入力の間の非線形マッピングです。連続ホップフィールド ネットワークの場合、一般的な活性化関数には Sigmoid、Tanh、ReLU が含まれます。適切なアクティベーション関数を選択すると、ネットワークのパフォーマンスを向上させることができます。
-
適切なエネルギー関数を設計する: 連続ホップフィールド ネットワークの中核は、ネットワーク状態の安定性を記述するエネルギー関数です。適切なエネルギー関数を設計すると、ネットワークの収束速度と安定性が向上します。
-
重み行列の初期化: 重み行列の初期化は、ネットワークのパフォーマンスに大きな影響を与えます。一般的に使用される初期化方法には、ランダム初期化、He 初期化、Xavier 初期化などがあります。適切な初期化戦略により、ネットワークのコンバージェンス速度が向上し、パフォーマンスが向上します。
-
学習率の調整: 学習率はニューラル ネットワークの重要なハイパーパラメーターであり、重みが更新される速度を決定します。固定学習率、減衰学習率、適応学習率などの適切な学習率戦略を使用すると、最適化効果を向上させることができます。
-
正則化: 正則化は、損失関数に正則化項を追加することで過学習を防ぐ方法です。一般的な正則化方法には、L1 正則化、L2 正則化、ドロップアウトなどがあります。適切な正則化戦略により、ネットワークの汎化能力を向上させることができます。
-
トレーニング戦略: 連続ホップフィールド ネットワークのトレーニングには、バッチ勾配降下法、確率的勾配降下法、ミニバッチ勾配降下法などの方法を使用できます。異なるトレーニング戦略は収束速度とパフォーマンスに異なる影響を与えるため、実際の問題に応じて適切なトレーニング方法を選択する必要があります。
-
モデルの選択と評価: トレーニング中に、相互検証、モデル選択、ハイパーパラメーター調整などの手法を使用して、最適なモデルとパラメーター設定を選択できます。さらに、ネットワークのパフォーマンスを正確に測定するには、評価指標を適切に設計する必要があります。
要約すると、連続ホップフィールド ニューラル ネットワークの最適化には、多くの側面で戦略とテクニックが必要であり、最高のパフォーマンスを達成するには、実際の問題とデータ セットに応じて調整する必要があります。
TSP(巡回セールスマン問題、巡回セールスマン問題)
TSP (巡回セールスマン問題) を例として、連続ホップフィールド ニューラル ネットワークを最適化に使用する方法を説明します。
TSP 問題は古典的な組み合わせ最適化問題であり、一連の都市とそれらの間の距離を指定して、各都市を 1 回だけ訪問し、開始都市に戻る最短経路を見つける必要があります。
この例では、連続ホップフィールド ニューラル ネットワークを最適化することで TSP 問題を解決できます。
-
ネットワーク表現: まず、TSP 問題を連続ホップフィールド ニューラル ネットワークとして表現する必要があります。N 個の都市があると仮定すると、N×N 行列 X を使用してネットワーク状態を表すことができます。ここで、各要素 x_ij は、都市 i がアクセス順序の j 番目の位置である確率を表します。
-
エネルギー関数: 次に、ネットワーク状態の品質を測定するためのエネルギー関数を設計する必要があります。一般的に使用されるエネルギー関数は次のとおりです。
E(X) = A * (Σ_i(Σ_j x_ij - 1)^2 + Σ_j(Σ_i x_ij - 1)^2) + B * Σ_i Σ_j Σ_k d_ik * x_ij * x_k(j+1)
ここで、A と B はトレードオフ係数、d_ik は都市 i と都市 k の間の距離です。最初の項は各都市が 1 回だけ訪問されることを保証し、第 2 項は各場所に 1 つの都市のみが存在することを保証し、第 3 項はパスの合計長を表します。
- 運動方程式: エネルギー関数を最適化するには、エネルギー関数の勾配を考慮して運動方程式を構築する必要があります。この例では、シグモイド関数を活性化関数として使用し、勾配降下法を使用して最適化できます。
dx_ij/dt = -∂E/∂x_ij + γ * f(x_ij) * (1 - f(x_ij))
ここで、 f(x_ij) = 1/(1 + exp(-β * x_ij))、γ と β はハイパーパラメータです。
-
パラメータの設定と最適化: 実際の最適化プロセスでは、適切なトレードオフ係数 A と B、およびハイパーパラメータ γ と β を選択する必要があります。これらのパラメーターは、相互検証やグリッド検索などの方法で調整できます。さらに、適切な学習率とトレーニング戦略を設定する必要もあります。たとえば、適応学習率やミニバッチ勾配降下法を使用できます。
-
デコードと評価: 最後に、ネットワーク状態行列 X を TSP 問題の解決策にデコードする必要があります。一般的なデコード方法は、各行と列の最大確率値に対応する都市と場所を取得することです。次に、解の合計パス長を計算して、TSP 問題を解決するための連続ホップフィールド ニューラル ネットワークのパフォーマンスを評価できます。
上記の手順を通じて、連続ホップフィールド ニューラル ネットワークを使用して TSP 問題を最適化できます。
コード
diff_u
% % % % 计算du
function du=diff_u(V,d)
global A D
n=size(V,1);
sum_x=repmat(sum(V,2)-1,1,n);
sum_i=repmat(sum(V,1)-1,n,1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
du=-A*sum_x-A*sum_i-D*sum_d;
エネルギー
% % % % % 计算能量函数
function E=energy(V,d)
global A D
n=size(V,1);
sum_x=sumsqr(sum(V,2)-1);
sum_i=sumsqr(sum(V,1)-1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
sum_d=sum(sum(V.*sum_d));
E=0.5*(A*sum_x+A*sum_i+D*sum_d);
主要
%% 连续Hopfield神经网络的优化—旅行商问题优化计算
%% 清空环境变量、定义全局变量
clear all
clc
global A D
%% 导入城市位置
load city_location
%% 计算相互城市间距离
distance = dist(citys,citys');
%% 初始化网络
N = size(citys,1);
A = 200;
D = 100;
U0 = 0.1;
step = 0.0001;
delta = 2 * rand(N,N) - 1;
U = U0 * log(N-1) + delta;
V = (1 + tansig(U/U0))/2;
iter_num = 10000;
E = zeros(1,iter_num);
%% 寻优迭代
for k = 1:iter_num
% 动态方程计算
dU = diff_u(V,distance);
% 输入神经元状态更新
U = U + dU*step;
% 输出神经元状态更新
V = (1 + tansig(U/U0))/2;
% 能量函数计算
e = energy(V,distance);
E(k) = e;
end
%% 判断路径有效性
[rows,cols] = size(V);
V1 = zeros(rows,cols);
[V_max,V_ind] = max(V);
for j = 1:cols
V1(V_ind(j),j) = 1;
end
C = sum(V1,1);
R = sum(V1,2);
flag = isequal(C,ones(1,N)) & isequal(R',ones(1,N));
%% 结果显示
if flag == 1
% 计算初始路径长度
sort_rand = randperm(N);
citys_rand = citys(sort_rand,:);
Length_init = dist(citys_rand(1,:),citys_rand(end,:)');
for i = 2:size(citys_rand,1)
Length_init = Length_init+dist(citys_rand(i-1,:),citys_rand(i,:)');
end
% 绘制初始路径
figure(1)
plot([citys_rand(:,1);citys_rand(1,1)],[citys_rand(:,2);citys_rand(1,2)],'o-')
for i = 1:length(citys)
text(citys(i,1),citys(i,2),[' ' num2str(i)])
end
text(citys_rand(1,1),citys_rand(1,2),[' 起点' ])
text(citys_rand(end,1),citys_rand(end,2),[' 终点' ])
title(['优化前路径(长度:' num2str(Length_init) ')'])
axis([0 1 0 1])
grid on
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
% 计算最优路径长度
[V1_max,V1_ind] = max(V1);
citys_end = citys(V1_ind,:);
Length_end = dist(citys_end(1,:),citys_end(end,:)');
for i = 2:size(citys_end,1)
Length_end = Length_end+dist(citys_end(i-1,:),citys_end(i,:)');
end
disp('最优路径矩阵');V1
% 绘制最优路径
figure(2)
plot([citys_end(:,1);citys_end(1,1)],...
[citys_end(:,2);citys_end(1,2)],'o-')
for i = 1:length(citys)
text(citys(i,1),citys(i,2),[' ' num2str(i)])
end
text(citys_end(1,1),citys_end(1,2),[' 起点' ])
text(citys_end(end,1),citys_end(end,2),[' 终点' ])
title(['优化后路径(长度:' num2str(Length_end) ')'])
axis([0 1 0 1])
grid on
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
% 绘制能量函数变化曲线
figure(3)
plot(1:iter_num,E);
ylim([0 2000])
title(['能量函数变化曲线(最优能量:' num2str(E(end)) ')']);
xlabel('迭代次数');
ylabel('能量函数');
else
disp('寻优路径无效');
end