Posts Issued in September, 2024

posted by sakurai on September 27, 2024 #877

ChatGPTにグラフを3本書いて貰います。区間差分をどのように取るかの違いで3種類考えられます。PIRの原則ではこの区間差分(検査区間内の累積分布)の$K_\text{MPF}$倍が修理度となります。

  • 区間内の累積分布=区間不稼働度の差分: $Q_\text{exact}(t)$においては$Q(i\tau)-Q((i-1)\tau)$
  • 区間内の累積分布=区間不信頼度が一定: $Q_\text{approx1}(t)$においては$-F(\tau)$
  • 区間内の累積分布=区間不信頼度の差分: $Q_\text{approx2}(t)$においては$F(i\tau)-F((i-1)\tau)$

$\dagger Q_\text{approx2}(t)$において区間不信頼度($K_\text{MPF}$倍する前の修理度)は、 $$ \require{cancel} F(i\tau)-F((i-1)\tau)=\bcancel{1}-e^{-i\tau}-\bcancel{1}+e^{-(i-1)\tau}\\ =e^{-i\tau}\left(e^{\tau}-1\right)=-F(\tau)e^{-i\tau}=-F(\tau)R(i\tau) $$ 修理度の絶対値が$R(i\tau)$だけ次第に小さくなりますが、それを無視し$R(i\tau)\approx1$とすれば$Q_\text{approx1}(t)$と同じになります。

import numpy as np
import matplotlib.pyplot as plt
from functools import lru_cache

plt.rcParams['font.family'] = 'serif'
plt.rcParams['mathtext.rm'] = 'Times New Roman'
plt.rcParams['mathtext.fontset'] = 'cm'

# パラメータ設定
lambdaVal = 0.1  # 故障率
tau = 2    # 点検期間
K = 0.5    # 修復率
epsilon = 0.00001  # 不連続点の直前を示すために使用する小さい値

# 関数定義
def R(t):
    """信頼度関数"""
    return np.exp(-lambdaVal * t)

def F(t):
    """故障関数"""
    return 1 - R(t)

@lru_cache(maxsize=None)
def Q_n(t, n):
    """Q_nの再帰関数。結果をキャッシュする。"""
    if n == 0:
        return F(t)
    else:
        tau_n = n * tau
        tau_n_minus_1 = (n - 1) * tau
        return 

def Q_approx1(t):
    """tにおけるQ(t)の近似値を計算する関数"""
    u = t % tau
    return (1 - K) * F(t) + K * F(u)

# 定義された Q_approx2(t) を追加して描画します。

def Q_approx2(t, n):
    """tにおけるQ_approx2の近似値を計算する関数"""
    return F(t) - n * K * (F(t) - F(t - tau))
    
# グラフ描画
fontsize_axes_label = 24 * 1.2
fontsize_ticks = 16 * 1.2
fontsize_legend = 24 * 1.2

# グラフ描画
plt.figure(figsize=(18, 11))
# 軸(spines)の線幅を太くする
ax = plt.gca()  # 現在の軸を取得
spine_width = 2  # 軸の線幅
for spine in ax.spines.values():
    spine.set_linewidth(spine_width)

# 凡例用のダミープロット
plt.plot([], [], '-', label=r'$Q_{\mathrm{exact},n}(t)$ for $\lambda = 0.1$', color='black')
plt.plot([], [], '-', label=r'$Q_{\mathrm{approx1}}(t)$ for $\lambda = 0.1$', color='blue')
plt.plot([], [], '-', label=r'$Q_{\mathrm{approx2}}(t)$ for $\lambda = 0.1$', color='green')

# 不連続性を示すために各区間を個別にプロット
for i in range(10):
    start = i * tau
    end = (i + 1) * tau - epsilon
    t_vals = np.linspace(start, end, 200)
    Q_exact_vals = [Q_n(t, i) for t in t_vals[:-1]]  # 区間の最後の点を除外してプロット
    Q_approx1_vals = [Q_approx1(t) for t in t_vals[:-1]]
    Q_approx2_vals = [Q_approx2(t, i) for t in t_vals[:-1]]
    
    plt.plot(t_vals[:-1], Q_exact_vals, 'k-', lw=2.5)
    plt.plot(t_vals[:-1], Q_approx1_vals, 'b-', lw=2.5)
    plt.plot(t_vals[:-1], Q_approx2_vals, 'g-', lw=2.5)

    # 区間の終わりに白丸をプロット
    plt.plot(end, Q_n(end, i), 'o', mfc='white', mec='black', mew=2, markersize=8)
    plt.plot(end, Q_approx1(end), 'o', mfc='white', mec='black', mew=2, markersize=8)
    plt.plot(end, Q_approx2(end, i), 'o', mfc='white', mec='black', mew=2, markersize=8)

plt.xlabel('Time (t)', fontsize=fontsize_axes_label)
plt.ylabel(r'$Q(t)$', fontsize=fontsize_axes_label)
plt.xticks(np.arange(0, 11 * tau, tau), fontsize=fontsize_ticks)
plt.yticks(fontsize=fontsize_ticks)
legend = plt.legend(fontsize=fontsize_legend)
for handle in legend.legendHandles:
    handle.set_linewidth(2.5)  # ここで線の太さを指定    
plt.grid(True, color='gray', linestyle='-', linewidth=1.4)
plt.ylim(bottom=0)
plt.xlim(0, 10 * tau)
plt.subplots_adjust(left=0.14, bottom=0.14)
plt.show()

図%%.1
図877.1 3つのグラフ

このように、$Q_\text{exact}(t)$が最も正確な不稼働度(PUA)であり、上記$\dagger$のように修理度を大と近似すると$Q_\text{approx1}(t)$で下界となり、修理度を小と近似すると$Q_\text{approx2,n}(t)$で上界となることが分かります。


なお、本稿はRAMS 2025に投稿予定のため一部を秘匿しています。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 26, 2024 #876

続きです。ChatGPTの出力を見やすく加工(キャンセル等)・修正しています。


次に、シグマの部分の式を解析的に簡約化し整理します。

$$ \require{cancel} \sum_{i=1}^{n} \left[ F(i\tau) - F\left( (i - 1)\tau \right) \right] \cdot R(t - i\tau) =\sum_{i=1}^{n} \left[ \bcancel{1}- R(i\tau) - \bcancel{1} +R\left( (i-1)\tau \right) \right] R(t - i\tau) $$

シグマ内の項を$R(t)$のメモリーレス性及び分配則を用いて展開します。

$$ R\left( (i-1)\tau \right) R(t - i\tau) - R(i\tau) R(t - i\tau)\\ = R\left((\bcancel{i}-1)\tau + t - \bcancel{i\tau} \right) - R\left(\bcancel{i\tau} + (t - \bcancel{i\tau}) \right)= R(t - \tau) - R(t) $$

シグマを展開すると、カッコ内は$i$には依存しないため$n$倍となります。

$$ \sum_{i=1}^{n} \left[ R\left( (i-1)\tau \right) - R(i\tau) \right] R(t - i\tau) = n R(t - \tau) - n R(t) $$

以上より、元のシグマの式は以下のように整理されます。

$$ A(t) = R(t) + K_{\text{MPF}}\sum_{i=1}^{n} \left[ F(i\tau) - F\left( (i - 1)\tau \right) \right] \cdot R(t - i\tau)= R(t) + nK_{\text{MPF}} \left[ R(t - \tau) - R(t) \right] $$

よって、$Q_\text{approx2}(t)$は、 $$ Q_\text{approx2}(t)= F(t) - n K_{\text{MPF}} \left[ F(t) - F(t - \tau) \right] $$

となります。

なお、本稿はRAMS 2025に投稿予定のため一部を秘匿しています。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 25, 2024 #875

ChatGPTがバージョンアップして推論が強化されたようなので、早速PUAの導出を試しました。


連続修理の場合:

稼働度 $ A(t) $ は以下の式で表されます:

$$ A(t) = R(t) + \displaystyle \int_{0}^{t} m(x) \cdot R(t - x) \, dx $$

ここで、$ R(t) $ は時刻 $ t $ での信頼度、$ m(x) $ は時刻 $ x $ でのリニューアル密度です。

周期 $ \tau $ の定期修理の場合:

修理が周期的に時刻 $ x = i \tau $($ i = 1, 2, \dots, n$)で行われるため、リニューアル密度 $ m(x) $ はこれらの時刻でのディラックのデルタ関数の和として表されます:

$$ m(x) = \sum_{i=1}^{n} m_i \delta(x - i\tau) $$

ここで、$ m_i $ は各修理時刻での修理量であり、$ \delta(x - i\tau) $ は時刻 $ x = i\tau $ でのディラックのデルタ関数です。

この場合、稼働度 $ A(t) $ は次のように変形されます:

$$ \begin{align} A(t) &= R(t) + \int_{0}^{t} \left( \sum_{i=1}^{n} m_i \delta(x - i\tau) \right) \cdot R(t - x) \, dx \\ &= R(t) + \sum_{i=1}^{n} m_i \cdot R(t - i\tau) \end{align} $$

修理量の計算:

各修理時刻 $ i\tau $ での修理量 $ m_i $ は、検査区間内の故障の累積に比例し、次のように表されます:

$$ m_i = \int_{(i-1)\tau}^{i\tau} m(x) \, dx = K_{\text{MPF}} \left[ F(i\tau) - F\left( (i - 1)\tau \right) \right] $$

ここで、

  • $ K_{\text{MPF}} $ は定数、
  • $ f(x) $ は故障密度関数、
  • $ F(x) = \int_{0}^{x} f(u) \, du $ は累積分布関数です。

したがって、周期 $ \tau $ の定期修理の場合の稼働度は:

$$ A(t) = R(t) + \sum_{i=1}^{n} K_{\text{MPF}} \left[ F(i\tau) - F\left( (i - 1)\tau \right) \right] \cdot R(t - i\tau) $$

これにより、連続修理の場合の方程式が、定期修理の場合には離散的な和を含む形に変化し、$ m(x) $ も適切に考慮されます。


今回ChatGPTは各検査区間内の累積した不稼働度を上記のように不信頼度として差し引いています。以前の新方式の記事ではこのように不稼働度を用いましたが、ChatGPTの提案の不信頼度を用いると、どの程度誤差が出るかを見てみます。

なお、本稿はRAMS 2025に投稿予定のため一部を秘匿しています。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 24, 2024 #874

図867.1に基づき、最後にQ-network及びTarget Q-networkとDQN損失とのインタフェース信号を聞いてみます。


Q-network及びTarget Q-networkとDQN損失との間のインタフェース信号と、それらの間でのデータのやりとりを、再度整理して説明します。

Q-networkとDQN損失のインターフェース

  • Q-networkの出力:

    • Q-networkは、ある状態$s$と行動$a$に対するQ値、$Q(s, a; \theta)$を出力します。これは、現在のパラメータ$\theta$を用いたQ-networkの予測値です。
  • Q-networkの入力(勾配に関して):

    • Q-networkはDQN損失関数から勾配$\nabla_{\theta} L(\theta)$を「入力」として受け取り、この勾配に基づいてパラメータ$\theta$を更新します。ここでの「入力」とは、勾配降下法によるパラメータ更新の文脈で使用される勾配情報を指します。

Target Q-networkとDQN損失のインターフェース

  • Target Q-networkの出力:
    • Target Q-networkは、次の状態$s'$におけるすべての可能な行動$a'$に対するQ値の最大値、$\max_{a'} Q(s', a'; \theta^-)$を出力します。ここで、$\theta^-$はTarget Q-networkのパラメータです。

DQN損失の計算

  • DQN損失関数:
    • DQNの損失$L(\theta)$は、Q-networkの出力$Q(s, a; \theta)$とTarget Q-networkの出力$\max_{a'} Q(s', a'; \theta^-)$を使用して計算されます。損失関数は、以下のように定義されます。

$$L(\theta) = \mathbb{E}\left[\left(r + \gamma \max_{a'} Q(s', a'; \theta^-) - Q(s, a; \theta)\right)^2\right]$$

ここで、$r$は即時報酬、$\gamma$は割引率です。

パラメータ更新

  • パラメータ$\theta$の更新:
    • DQN損失関数に基づいた勾配$\nabla_{\theta} L(\theta)$を計算し、この勾配を用いてQ-networkのパラメータ$\theta$が更新されます。

$$ \theta \leftarrow \theta - \alpha \nabla_{\theta} L(\theta) $$

ここで、$\alpha$は学習率です。

以上が、Q-network及びTarget Q-networkとDQN損失との間でやり取りされる主要な信号と、それに基づくパラメータ更新のプロセスです。この相互作用により、Q-networkは最適な行動価値関数を学習し、パフォーマンスを向上させることができます。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 23, 2024 #873

図867.1に基づき、リプレイメモリからの出力信号を聞いてみます。


リプレイメモリからの出力とそれぞれのコンポーネント(Q-network、Target Q-network、DQN損失)への入力に関して、具体的に明確化しましょう。

リプレイメモリからの出力と各コンポーネントへの入力

リプレイメモリに保存される経験は、タプル$(s, a, r, s', done)$の形式で、それぞれ現在の状態$s$、選択された行動$a$、得られた報酬$r$、次の状態$s'$、そしてエピソードが終了したかどうかを示すフラグ$done$を含みます。

  1. Q-networkへの入力: Q-networkは現在の状態$s$と行動$a$を入力として受け取り、その組み合わせに対するQ値$Q(s, a; \theta)$を出力します。ここで、$\theta$はQ-networkのパラメータです。

  2. Target Q-networkへの入力: Target Q-networkは次の状態$s'$を入力として受け取り、その状態におけるすべての可能な行動$a'$に対するQ値の最大値$\max_{a'} Q(s', a'; \theta^-)$を出力します。ここで、$\theta^-$はTarget Q-networkのパラメータです。

  3. DQN損失の計算に使用される情報: DQN損失の計算には、現在の状態$s$と行動$a$に対するQ値$Q(s, a; \theta)$、次の状態$s'$における最大Q値$\max_{a'} Q(s', a'; \theta^-)$、即時報酬$r$、および終了フラグ$done$が使用されます。DQN損失は以下の式で表されます:

    $$L(\theta) = \mathbb{E}\left[\left(r + \gamma \max_{a'} Q(s', a'; \theta^-) - Q(s, a; \theta)\right)^2\right]$$

    ここで、$\gamma$は割引率です。$done$フラグがTrueの場合(つまり、エピソードが終了した場合)、次の状態における報酬は考慮されず、損失は$r - Q(s, a; \theta)$の差のみを基に計算されます。

このように、リプレイメモリからの出力は、Q-networkとTarget Q-networkの学習、およびDQN損失の計算において、異なる形で使用されます。このプロセスを通じて、エージェントは最適な行動ポリシーを学習し、パフォーマンスを向上させていきます。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 20, 2024 #872

図867.1に基づき、環境とリプレイメモリの間のインタフェースを聞いてみます。


環境とリプレイメモリ(Replay Memory)間のインタラクションにおける「出力信号」は、エージェントが環境内で取る行動の結果得られる経験(状態、行動、報酬、次の状態)の保存という形で行われます。リプレイメモリは、これらの経験を蓄積し、学習プロセス中にこれらの経験からランダムにサンプルを抽出してモデルを更新するために使用します。このプロセスを数学的な記号を用いて説明します。

環境からリプレイメモリへの出力

環境とエージェントの相互作用は、タイムステップ$t$において以下の形で表されます。

  • 状態$s_t$: エージェントが観測する環境の現在の状態。
  • 行動$a_t$: エージェントが状態$s_t$において選択する行動。
  • 報酬$r_{t+1}$: 行動$a_t$の結果として環境から得られる報酬。
  • 次の状態$s_{t+1}$: 行動$a_t$を取った後の環境の新しい状態。
  • 終了フラグ$done$: エピソードが終了したかどうかを示すフラグ。

これらの情報は、エージェントの経験$(s_t, a_t, r_{t+1}, s_{t+1}, done)$としてリプレイメモリに保存されます。

リプレイメモリの役割

リプレイメモリの主な役割は、エージェントの経験を保存し、後の学習プロセスで使用するためのサンプルを提供することです。このメカニズムは、以下の手順で機能します。

  1. 経験の保存: エージェントが環境と相互作用し、新しい経験を得るたびに、この経験$(s_t, a_t, r_{t+1}, s_{t+1}, done)$はリプレイメモリに保存されます。
  2. ランダムサンプリング: 学習フェーズでは、リプレイメモリからランダムに経験のミニバッチが選択され、Q-networkの更新に使用されます。このランダムサンプリングにより、サンプル間の相関が減少し、学習プロセスが安定化します。

リプレイメモリと環境の間の「出力信号」は、具体的には環境から得られた経験の保存という形で行われ、これらの経験は後に学習プロセスで重要な役割を果たします。このメカニズムにより、エージェントは過去の経験から効率的に学習し、性能を向上させることができます。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 19, 2024 #871

図867.1に基づき、Q-networkからTarget Q-networkへのインタフェースを聞いてみます。


Deep Q-Network (DQN) アーキテクチャにおいて、Q-networkとTarget Q-networkの間で直接的な「出力信号」の交換はありません。代わりに、これら二つのネットワークは同じ構造を持ちながら、異なるパラメータセットを用いて状態$s$に対する行動$a$の価値、すなわちQ値を推定します。Q-networkのパラメータを$\theta$、Target Q-networkのパラメータを$\theta^-$とすると、それぞれのQ値は$Q(s, a; \theta)$および$Q(s, a; \theta^-)$と表されます。

Q-networkからTarget Q-networkへの「更新」

Target Q-networkの役割は、学習中の更新プロセスにおいて、安定したQ値の目標値を提供することにあります。Q-networkからTarget Q-networkへの「インタフェース」は、一定間隔で$\theta$の値を$\theta^-$へとコピーする更新プロセスを通じて行われます。この更新は以下のように行われます。

$$ \theta^- \leftarrow \theta $$

この更新操作により、Target Q-networkのパラメータ$\theta^-$がQ-networkのパラメータ$\theta$に置き換わります。これにより、学習プロセス中のターゲットQ値の計算に一定の安定性がもたらされます。

Target Q-networkの役割

Target Q-networkは、TD誤差(Temporal Difference error)の計算において、次の状態$s'$での最大Q値を提供します。具体的には、学習の各ステップにおいて、TD誤差は以下の式に従って計算されます。

$$ TD_{\text{error}} = \left( r + \gamma \max_{a'} Q(s', a'; \theta^-) - Q(s, a; \theta) \right) $$

ここで、$r$は報酬、$\gamma$は割引率です。このTD誤差は、Q-networkのパラメータ$\theta$の勾配降下更新に使用されますが、Target Q-network自体からQ-networkへの直接的な「出力信号」はありません。

要約すると、Q-networkとTarget Q-network間のインタフェースは、パラメータの定期的なコピーによるものであり、このプロセスによって、学習の安定性と効率が向上します。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 18, 2024 #870

図867.1に基づき、5つのファンクションの間の関係を深掘りしてみます。まず環境とQ-networkとのインタフェースを聞いてみます。


強化学習における環境とQ-network間のインタフェースは、数学的な記号を用いて以下のように表現することができます。ここで、$Q(s, a; \theta)$は、パラメータ$\theta$を持つQ-networkによって推定される、状態$s$における行動$a$の期待される報酬(Q値)を表します。

環境からQ-networkへの出力

  1. 状態$s$: 環境は、現在の状態$s$をQ-networkに出力します。この状態は、例えばビデオゲームのフレームやセンサーからの読み取り値など、その時点での環境の状況を表す情報です。

Q-networkから環境への出力(間接的)

  1. 行動$a$: Q-networkは、入力された状態$s$に基づいて、各行動$a$に対するQ値、$Q(s, a; \theta)$を計算します。そして、ある方策(ポリシー)に従って、このQ値が最大となる行動$a^*$を選択します。この行動選択のプロセスは数学的には以下のように表現されます: $$ a^* = \arg\max_a Q(s, a; \theta) $$ 選択された行動$a^*$は、環境に適用され、環境の状態が更新されます。

学習プロセス

  • 状態の更新と報酬の取得: エージェントが行動$a^*$を取った後、環境は新しい状態$s'$と即時報酬$r$をエージェントに提供します。また、エピソードが終了したかどうかを示すフラグ$done$も提供されます。
  • DQNの損失関数の計算: 学習のため、DQNは以下の損失関数$L(\theta)$を使用して、パラメータ$\theta$を更新します。 $$ L(\theta) = \mathbb{E} \left[ \left( r + \gamma \max_{a'} Q(s', a'; \theta^-) - Q(s, a; \theta) \right)^2 \right] $$ ここで、$\theta^-$はターゲットQ-networkのパラメータ、$\gamma$は割引率です。

このプロセスを通じて、Q-network(エージェント)は環境との相互作用から学習し、最適な行動選択ポリシーを発達させていきます。


左矢前のブログ 次のブログ右矢

posted by sakurai on September 17, 2024 #869

RAMSポータルに例年どおりプログラム表が掲載されました。

表869.1 RAMS 2025プログラムマトリクス
図%%.1

会場となるヒルトンのボールルームの写真です。

図%%.2
図869.1 ヒルトンのボールルーム

左矢前のブログ 次のブログ右矢

posted by sakurai on September 16, 2024 #868

査読はポアソン分布との関係を記載するようにということだったので、指数分布の前にポアソン分布の記述を追加しAJEの査読も済み、RAMSに修正版を投稿しました。合わせて学会参加登録も完了しました。

過去記事のとおり、2項分布の極限を取るとポアソン分布となります。ポアソン分布は故障率一定の条件において、一定の時間間隔に何回故障等のイベントが起こるかの分布ですが、イベント間隔はその無記憶性から指数分布となります。

表868.1 RAMS 2025へのマイルストーン
期限 マイルストーン 状態
2024/5/3 アブストラクト投稿締め切り(システム入力) 投稿済
2024/6/10 アブストラクト採択結果 採択済
2024/7/15 論文、プレゼン投稿締め切り(名前、所属無し版) 投稿済
2024/9/1
2024/9/15
第1回論文、プレゼン資料査読コメント受領 投稿済
2024/10/4 学会出席登録締め切り 登録済
2024/10/4 最終論文、プレゼン投稿締め切り(名前、所属有り版)


左矢前のブログ 次のブログ右矢


ページ: