Posts Issued in May, 2025

PMHF式の誤りの論文 (2)

posted by sakurai on May 20, 2025 #976

そして、肝心のPMHFの式部分は以下のとおりです。

図%%.1
図976.1 論文のPMHF方程式

(3)では3つの故障率を単純に加えていますが、これは過去記事(下記)で取り上げた論文と同じく誤りです。

(3)式が誤りである理由はPMHFは確率由来だからであり、安全目標違反確率を求めるにはDPF項には故障率の二乗が必要だからです。具体的にはIFのMPF故障率とSMのレイテント故障率の二乗となります。一方(3)式はレイテント故障率を単純にSPF項と加算しています。

それにしてもPMHF式を引用する人たちはなぜ規格Part 10にPMHF式があるにもかかわらず、その公式を用いずに、論文$\dagger$の誤った式を参照するのでしょうか?参考にするなら規格式を参照すれば良いと思うのですが、今までに規格式を引用した論文を、ほぼ見たことがないことが不思議でなりません。


$\dagger$ Y. Chang, L. Huang, H. Liu, C. Yang and C. Chiu, "Assessing automotive functional safety microprocessor with ISO 26262 hardware requirements," Technical Papers of 2014 International Symposium on VLSI Design, Automation and Test, Hsinchu, 2014, pp. 1-4, doi: 10.1109/VLSI-DAT.2014.6834876.


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

PMHF式の誤りの論文

posted by sakurai on May 19, 2025 #975

PMHF式が誤っている論文は大変に多く、その元凶は2014年のこの論文$\dagger$のようですが、また発見しました。

K, Lu and Y. Chen, "Safety-Oriented System Hardware Architecture Exploration in Compliance with ISO 26262,", Appl. Sci. 12(11), MDPI, 2022.

アブストラクトの翻訳文を示します。

要約:安全性が重要な自動車用インテリジェントシステムは、動作中に厳しい信頼性が要求されます。そのため、このような安全性が重要なシステムの開発では、安全性と信頼性の問題に対処しなければなりません。しかし、安全/信頼性の要件をシステムに組み込むと、設計の複雑さが大幅に増します。さらに、国際的な安全規格はガイドラインしか提供しておらず、具体的な設計手法やフローは示されていません。そのため、システム設計および検証の複雑さに対処し、国際的な安全規格の要件も満たす、システムエンジニアを支援する効果的な安全プロセスを開発することが、重要かつ価値のある研究課題となっています。本研究では、フォールトツリーに基づく脆弱性分析と安全志向のシステムハードウェアアーキテクチャの探索を統合した、安全志向のシステムハードウェアアーキテクチャ探索フレームワークを提案します。このフレームワークにより、ISO-26262 の安全要件およびハードウェアのオーバーヘッドの制約に準拠した、効率的なソリューションを迅速に発見することができます。探索フレームワークの実行後に、故障モード、影響、および診断分析(FMEDA)レポートが生成されます。提案したフレームワークは、システムエンジニアが、コスト効率の高い方法でシステムの安全性/堅牢性の設計、評価、および強化を行うことを容易にします。

ちなみに弊社の論文も[7]及び[10]の2件が参照されているものの、数式は全く考慮されていません。

図%%.1
図975.1 論文の参照文献[7]

これに対する本文での引用は以下のようです。

[7] の著者は、ISO 26262 に基づいて適用範囲を拡大するため、ミッション機能の故障率、安全機構の故障率、一次安全機構および二次安全機構の診断カバレッジ、二次安全機構の診断期間などの観測可能なパラメータを用いて、非冗長および冗長サブシステムにおける PMHF の計算のための一般化された式を提示しました。

全くこのとおりなので、このPMHF公式を参考にしてもらえば良かったのですが。

図%%.2
図975.2 論文の参照文献[10]

[10] の研究は、規格の重要な前提である定期的な検査と修理を考慮しながら、定量的なFTAのフレームワークを提供することを目的としています。このフレームワークは、マルコフ確率過程のモデルと、そのモデルから導式化したPMHF方程式に基づいています。

全くこのとおりなので、定期的な検査と修理を考慮したPMHF公式を参考にしてもらえば良かったのですが。 論文は批判的に読むものであって、このように自論文の飾りにするだけでは引用としての意味がありません。


$\dagger$ † Y. Chang, L. Huang, H. Liu, C. Yang and C. Chiu, "Assessing automotive functional safety microprocessor with ISO 26262 hardware requirements," Technical Papers of 2014 International Symposium on VLSI Design, Automation and Test, Hsinchu, 2014, pp. 1-4, doi: 10.1109/VLSI-DAT.2014.6834876.


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

Pongと強化学習 (99)

posted by sakurai on May 16, 2025 #974

コードの続きの説明です。


このコードブロックは、Deep Q-Network (DQN) アルゴリズムの一部で、経験再生バッファの設定と環境のリセットを行っています。これらのステップは、効果的な学習と安定したアルゴリズムの実行に必要な基礎を構築します。

1. Replay Buffer (経験再生バッファ) の初期化:
        rb = ReplayBuffer(
            args.buffer_size,
            envs.single_observation_space,
            envs.single_action_space,
            device,
            optimize_memory_usage=True,
            handle_timeout_termination=False
        )

ここで、ReplayBuffer オブジェクトを初期化しています。経験再生バッファは、エージェントが経験した観測、アクション、報酬、次の観測、終了フラグを記録するデータ構造です。学習中にこれらの過去の経験からランダムにサンプリングして学習データとして再利用することで、学習の効率と効果を向上させます。

  • buffer_size:バッファが保持できる最大の過去経験数です。
  • single_observation_spacesingle_action_space:それぞれ環境からの単一の観測空間とアクション空間を指定しています。
  • device:計算を実行するデバイス(CPUまたはGPU)。
  • optimize_memory_usage:メモリ使用の最適化を有効にするオプション。
  • handle_timeout_termination:タイムアウトによるエピソード終了を特別に扱うかどうかのフラグ。
2. 環境のリセット:
        start_time = time.time()
        obs, _ = envs.reset(seed=args.seed)
  • start_time に現在時刻を記録し、学習プロセスの時間計測を開始しています。これは後で学習経過の分析や報告に利用されることがあります。
  • envs.reset(seed=args.seed):エージェントが操作する環境をリセットし、新しいエピソードの開始状態を取得します。ここで seed を指定することにより、環境のランダム要素の再現性を保証しています。reset メソッドは初期観測を返します(この場合、観測とともに他の情報も返される可能性があるため、観測のみが _ を使って無視されている部分を受け取っています)。

この設定は、DQNの実行において重要な役割を果たし、安定した学習の基盤を提供します。特に経験再生バッファは、エージェントがさまざまな状況から学習できるようにし、一貫性のあるアップデートを可能にするために不可欠です。


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

Pongと強化学習 (98)

posted by sakurai on May 15, 2025 #973

以下のコードの説明をお願いします。

    q_network = QNetwork(envs).to(device)
    optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate)
    target_network = QNetwork(envs).to(device)
    target_network.load_state_dict(q_network.state_dict())

このコードは、Deep Q-Network (DQN) の実装の一部であり、以下の各ステップで特定の機能を実行しています。DQNは強化学習において、エージェントが最適な行動を学習するための一手法であり、ニューラルネットワークを用いて行動価値関数(Q値)を近似します。

1. Qネットワークの初期化:
        q_network = QNetwork(envs).to(device)

この行では、環境envsに基づいたQ値を推定するためのニューラルネットワーク(QNetworkクラスのインスタンス)を作成し、計算を行うデバイス(CPUまたはGPU)にモデルを移動しています。to(device)は、モデルを指定されたデバイス(例えばGPU)に配置し、計算の効率を向上させるために使用されます。

2. オプティマイザの設定:
        optimizer = optim.Adam(q_network.parameters(), lr=args.learning_rate)

ここでは、作成したQネットワークのパラメータを最適化するために、Adamオプティマイザを設定しています。lr=args.learning_rateは学習率を指定しており、これによりネットワークの学習プロセスの速度や収束の具合が調整されます。

3. ターゲットネットワークの初期化:
        target_network = QNetwork(envs).to(device)

DQNでは、学習の安定化のためにターゲットネットワークを使用します。この行では、元のQネットワークと同じ構造の新しいネットワークを作成し、同じデバイスに配置しています。ターゲットネットワークは、学習中に定期的にQネットワークから重みをコピーすることで更新されますが、その更新はQネットワークよりも頻繁ではありません。

4. ターゲットネットワークへの重みのコピー:
        target_network.load_state_dict(q_network.state_dict())

この行で、ターゲットネットワークに対してQネットワークの重みをコピーしています。これにより、両方のネットワークが学習開始時点で同じパラメータを持つことになります。ターゲットネットワークの重みは、一定の間隔でQネットワークから更新され、学習中の価値推定の安定性を保ちます。

これらのステップは、DQNの学習プロセスの基盤を構築しており、エージェントが与えられた環境内で最適なポリシーを効率的に学習するための準備を整えています。


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

Pongと強化学習 (97)

posted by sakurai on May 13, 2025 #972

Q-networkのpythonコードの各ステージをbsvに変換する予定です。一方、Q値からアクションを取り出す関数は何で、どのようにbsvに変換するのでしょうか?


Q-networkは主にAtariゲームのような画像ベースの入力を処理するために設計されており、各層(畳み込み層と全結合層)が特定の画像特徴を抽出し、最終的に行動空間のサイズに合わせた出力を生成します。

Q値からアクションを取り出すプロセス(Python)

Q-networkからアクションを選択するプロセスは、通常、Q値の配列の中で最大値を持つインデックスを選択することで行われます。これはPythonで以下のように表現されます(例としてPyTorchを使用):

    q_values = network(observation)
    action = q_values.argmax().item()

BSV(Bluespec SystemVerilog)への変換

BSVでこのプロセスを実装するには、いくつかのステップが必要です。まず、ニューラルネットワークの各層をBSVで実装する必要があります。次に、Q値の最大値を選択するロジックをBSVで記述します。

1. ネットワーク層の実装

BSVでは、畳み込み層や全結合層をカスタムモジュールとして実装することができます。例えば、畳み込み層をモジュールとして定義し、そのパラメータ(フィルタのサイズ、ストライド、パディング等)を指定します。全結合層も同様に、入力サイズと出力サイズをパラメータとしてモジュールを定義します。

    module mkConvolutionLayer#(parameter Int filterSize, Int numFilters, Int stride)(...);
        // 畳み込み層の実装
    endmodule
    
    module mkFullyConnectedLayer#(parameter Int inputSize, Int outputSize)(...);
        // 全結合層の実装
    endmodule

2. アクション選択ロジック

Q値から最大値を選択するモジュールは、入力としてQ値の配列を受け取り、最大値のインデックスを出力として返すように設計されます。これは、繰り返し比較と条件分岐を使用して実装できます。

    module mkSelectAction#(parameter Int numActions)(Vector#(numActions, Float) qValues) -> Action;
        Action action = 0;
        Float maxQValue = qValues[0];
        for (Integer i = 1; i < numActions; i++) {
            if (qValues[i] > maxQValue) {
                action = i;
                maxQValue = qValues[i];
            }
        }
        return action;
    endmodule

このように、BSVを使用してPythonで定義されたニューラルネットワークとその動作をFPGA向けに再設計し、具体的なハードウェアアクセラレーションを実現することが可能です。


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

Pongと強化学習 (96)

posted by sakurai on May 12, 2025 #971

例えばシリアル通信から来る、ジョイスティックを右に倒した事象をスイッチに見せかけるような回路を作成してください。


FPGAでUARTを介して特定のコマンドを受け取り、それをジョイスティックの動作に見せかけるようなスイッチ動作をエミュレートする回路を設計するためには、いくつかのステップが必要です。ここでは、Bluespec SystemVerilog (BSV) を使用してそのようなモジュールを設計する方法について説明します。

ステップ 1: UARTインターフェースの設定

まず、FPGAに既に設計されているUARTインターフェースを使用して、シリアルデータを受け取る必要があります。このUARTモジュールは、受信したデータを内部バスや処理モジュールに渡す役割を担います。

ステップ 2: コマンド解析ロジックの作成

受け取ったデータ(コマンド)を解析し、それが「右」や他のジョイスティックの動きに対応するコマンドであるかを判断するロジックを作成します。

ステップ 3: スイッチエミュレーションモジュールの設計

コマンドに基づいて、ジョイスティックのスイッチが操作されたかのような信号を生成するモジュールを設計します。このモジュールは、外部デバイスや他のFPGA内モジュールがジョイスティック入力として解釈できるような信号を出力します。

サンプルコード (Bluespec SystemVerilog)

以下は、これらのステップを実装するための基本的なBSVモジュールの例です。この例では、単純なコマンド解析とスイッチエミュレーションを示しています。

    import GetPut::*;  // Get, Put インターフェースを利用
    
    // UARTからのデータを受け取るモジュール
    module mkUART_Receiver(Ifc_UART);
        // UARTのデータ受信関連のロジック
        // ...
    
        rule receive_data;
            // UARTからデータを受け取る
            let cmd = uart.receive();
    
            // コマンドが「右」の場合、関連するアクションを実行
            if (cmd == "右") {
                // スイッチエミュレーション信号を生成
                joystickRightAction();
            }
        endrule
    
        method void joystickRightAction();
            // ジョイスティックの「右」動作に対応する信号を出力
            // ...
        endmethod
    endmodule

ステップ 4: テストとシミュレーション

設計したモジュールの動作を検証するために、シミュレーションを行い、さまざまなコマンドが適切に解析され、期待通りのスイッチ動作がエミュレートされるかを確認します。

この基本的なフレームワークを参考にして、より複雑なジョイスティックのエミュレーションや他の機能を拡張することができます。必要に応じて、エラー処理やその他のロバストな機能を追加してください。


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