「開発」カテゴリーアーカイブ

RISC Zeroとは?

RISC Zeroは、
zk-STARKs(Zero-Knowledge Scalable Transparent Argument of Knowledge)とRISC-Vマイクロアーキテクチャに基づいたゼロ知識の検証可能な汎用コンピューティングプラットフォームです。

ゼロ知識証明とは、ある当事者・証明したい人(Prover・以下:プロバー)が確かめたい人(Verifier・以下:ベリファイア)に、詳細を一切明かすことなく、何かが真実であることを納得させる手法です。RISC Zeroの場合、プロバーは特定のコードを正しく実行したことをベリファイアに示すことができますが、その際、コードの出力だけをベリファイアに公開し、入力や実行中の状態は一切明かしません
ゼロ知識性があるため、個人情報などのプロバーの特定情報が漏れることはない。

このコードは、zkVMと呼ばれる特別な仮想マシン上で実行されます。
RISC Zero zkVMは小さなRISC-Vコンピュータをエミュレートしており、RISC-V向けのコンパイラツールチェーンが存在する限り、任意のプログラミング言語で書かれたコードを実行できます。現在、Rust、C、およびC++のSDKサポートが存在します。

処理の概要
証明対象となるコードは、実装された言語からメソッドにコンパイルされます。メソッドは、メソッドのコードを実行する特別なエントリーポイントを持つRISC-V ELFファイルとして表現されます。また、メソッドごとにそのイメージID(ELFファイルの特殊な暗号ハッシュ)が計算され、検証に必要となります。
Executable and Linkable Format (ELF) は実行ファイルおよびオブジェクトファイルのためのファイルフォーマットである。コンテナフォーマットの一種。

次に、ホストプログラムが実行され、zkVM内でメソッドを証明します。zkVM内で動作する論理的なRISC-Vマシンをゲストと呼び、zkVMを実行するプロバーホストと呼びます。メソッドの実行中、ゲストホストは通信できますが、ホストはゲストの実行を変更することはできません。そうすると、生成される証明が無効になります。実行中に、ゲストコードは計算の公式な出力を表すジャーナルと呼ばれる特別な追記専用ログに書き込むことができます。

メソッドが正しく終了すると、正しい実行の証明としてレシートが生成されます。このレシートは、実行中に書き込まれたジャーナルと、シールと呼ばれる不透明な暗号データの2つの部分で構成されます。

ベリファイアは、このレシートを検証し、ログを調べることができます。ジャーナルシール改ざんされていた場合、レシートは検証に失敗します。また、ジャーナルの出力が正しい実行のものでない限り、有効なレシートを生成することは暗号的に不可能です。要するに、レシートは正しい実行のゼロ知識証明として機能します。

プロトコルがゼロ知識であるため、ベリファイアは、ジャーナルに書き込まれたデータやコードの正しい実行から推測されること以外には、ホストとゲストの間でやり取りされる詳細な実行やデータについて何も推測することができません。

RISC-Vとは?

RISC-V(リスク・ファイブ)とは、カリフォルニア大学バークレー校で開発されたオープンで拡張可能な命令セットアーキテクチャ(ISA)です。
ISAはプロセッサ間で共通化された、インターフェースとしての論理的な命令セットは命令セットアーキテクチャ(英: instruction set architecture, ISA)と呼ばれる。
RISC-Vは特にシンプルでモジュラー設計が特徴です。

以下に、RISC-Vの主な特徴を挙げます。

オープンでロイヤリティフリー
RISC-VはオープンなISAで、誰でも無料で使用することができ、ライセンス料がかかりません。そのため、商用や非商用を問わず、誰でもこのISAを利用して独自のプロセッサやソリューションを開発できます。

モジュラー設計
RISC-Vは基本命令セット(RV32IやRV64Iなど)と、それに追加可能なオプションの拡張(例えば、浮動小数点演算やベクトル処理など)から成り立っています。このモジュラー設計により、用途や必要に応じて柔軟にプロセッサをカスタマイズできます。

拡張性と柔軟性
RISC-Vの設計は、開発者が独自の拡張機能を追加できるように意図されています。これにより、特定のアプリケーションやニーズに合わせたカスタムプロセッサを容易に設計できます。

広範なコミュニティサポート
RISC-Vは世界中の企業、研究機関、開発者からの支持を受けており、オープンソースコミュニティによって積極的に開発と改善が進められています。

非営利組織による管理
RISC-Vの仕様は、RISC-V Internationalという非営利組織によって管理されており、この組織は特定の製品やサービスに商業的な利害関係を持たず、中立的な立場で活動しています。

RISC-Vは、従来のプロプライエタリなISAに代わるオープンな選択肢として注目されており、特に組み込みシステム、IoTデバイス、学術研究、さらには高性能コンピューティングの分野においても利用が広がっています。

飛んでモンテカルロのAI

世界的に有名なカジノや高級リゾートがある観光地です。モナコ・グランプリが開催される場所!
金持ちのイメージですが、AIでのモンテカルロは違います。
AIが絵描いたモンテカルロのイメージ
モンテカルロのイメージ
モンテカルロで円をAI業界の方が言うと思いますので、説明です。

モンテカルロ法(英: Monte Carlo method、MC)とは

モンテカルロ法とは、シミュレーションや数値計算を乱数を用いて行う手法の総称です。元々は、中性子が物質中を動き回る様子を探るために、スタニスワフ・ウラムが考案し、ジョン・フォン・ノイマンにより命名されました。この手法の名称は、カジノで有名なモナコ公国の4つの地区(カルティ)の1つであるモンテカルロから取られています。モンテカルロ法は「ランダム法」とも呼ばれ、様々な分野で広く利用されています。

モンテカルロ法の主な特徴と応用

  1. ランダム性の利用: モンテカルロ法は、ランダムなサンプル(数値やデータポイント)を生成し、それらを使って問題の解を推定します。このアプローチは、解析的な解が難しい問題に対して非常に有効です。
  2. 高次元問題への適用: モンテカルロ法は、高次元の積分や最適化問題など、解析的に解くのが難しい問題に対しても適用できます。
  3. 金融工学: モンテカルロ法はオプションの価格付け、リスク評価、ポートフォリオの最適化など、金融の分野で広く使われています。将来の資産価格のシナリオを多数生成し、それに基づいて意思決定を行います。
  4. 物理学・統計学: 物理学では、分子の挙動をシミュレーションするために、統計学では確率分布の評価などに使用されます。
  5. ゲーム開発やAI: モンテカルロ木探索(MCTS)は、チェスや囲碁のような複雑なゲームで次の一手を決定するためのアルゴリズムとして使われています。AIが最適な戦略を見つけるために多くのシミュレーションを行います。

モンテカルロ法の基本的な流れ

  1. 問題の定義(例えば、積分や最適化問題)。
  2. ランダムなサンプルを生成。
  3. サンプルに基づいて計算を行い、結果を得る。
  4. 多数のサンプルから結果を統計的に解析し、最終的な近似解を得る。

たとえば、円の面積をモンテカルロ法で求める場合、以下のようにします。

  1. 単位正方形の中に無作為に点を打つ。
  2. 円の内部に入った点の数を数える。
  3. 円の面積は、正方形の面積に対する円内の点の割合から推定されます。

モンテカルロ法は、多くのサンプルを用いることで、より正確な近似が可能となりますが、計算資源を多く消費することもあります。そのため、効率的にサンプルを生成する手法やアルゴリズムが研究されています。

Pythonで表すと

有名なやつを書きます。

モンテカルロ法で円周率を求める方法

この方法では、以下のステップを行います:

  1. 単位正方形(辺の長さが1の正方形)の中にランダムに点を打つ。
  2. 単位円(半径1の円、中心が正方形の中心)に入った点の数を数える。
  3. 円の面積と正方形の面積の比率から、πを推定します。

単位円の面積は πr2 ですが、今回は半径が1なので面積は π です。単位正方形の面積は 1×1=1 です。したがって、円内に入った点の割合を4倍すると π が近似できます。

import random

def monte_carlo_pi(num_samples):
    inside_circle = 0

    for _ in range(num_samples):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        
        if x**2 + y**2 <= 1:
            inside_circle += 1

    return (inside_circle / num_samples) * 4

# サンプル数を設定して実行
num_samples = 1000000
estimated_pi = monte_carlo_pi(num_samples)
print(f"Estimated π value: {estimated_pi}")

コードの解説

  1. ランダムなサンプル生成:
    random.uniform(0, 1) を使って、[0, 1] の範囲でランダムな x, y 座標を生成します。
  2. 円内に入った点のカウント:
    x**2 + y**2 <= 1 という条件を使って、点が単位円の内部にあるかを確認します。
  3. πの推定:
    円内に入った点の数を総サンプル数で割り、4を掛けて π の近似値を求めます。

結果

Estimated π value: 3.140968
サンプル数を増やすことで、より正確なπの値が得られます。上記のコードでは、100万サンプルを使用していますが、計算リソースや精度のトレードオフに応じて調整が可能です。

この基本的なモンテカルロ法の例を元に、より複雑な問題にも適用できるように拡張していくこと

オマケ

モンテカルロ法でどんどんサンプル数を入れたら、どうなのか?グラフにしてみました。
10から10億回処理してみる、こんなグラフになります。どんどん、理想の数値に収束していきます。

androidでFlutterで録音するには?

androidでFlutterで録音するには?

Flutterの開発環境が整っていることです。
詳細を知りたい方は別途ご連絡ください。

https://pub.dev/packages/record

permissionの設定

プロジェクト作成した後に、下記のファイルを探して、
/android/app/src/main/AndroidManifest.xml
に下記を1行追加。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 録音許可を追加 -->

パッケージ追加

プロジェクト作成した後に、下記のファイルを探して、
/pubspec.yaml
flutter:の行を追加

dependencies:
  flutter:
    sdk: flutter
  record: ^5.0.1

ターミナルで下記のコマンド実行

flutter pub get

プログラム

パッケージ設定

import 'package:record/record.dart';

// AudioRecorderのインスタンスを作成
final record = AudioRecorder();

// 録音のための許可をチェックし、必要に応じてリクエスト
if (await record.hasPermission()) {
  // ファイルへの録音を開始 ここのパスを間違えると録音ができないです。ログ等を細かく確認してください。
  await record.start(const RecordConfig(), path: 'aFullPath/sample.m4a');
  // ... またはストリームへの録音を開始
  final stream = await record.startStream(const RecordConfig(AudioEncoder.pcm16bits));
}

// 録音を停止し、ファイルパスを取得
final path = await record.stop();
// ... または録音をキャンセル(これによりファイル/ブロブが暗黙的に削除される)
await record.cancel();

// リソースを解放
record.dispose(); // これを忘れないでください。