「AI」カテゴリーアーカイブ

R言語とPython言語

AIでよく出てくる、2言語。

R言語とPython言語

R言語

用途:主に統計解析やデータビジュアライゼーションに強みがあります。
AIへの適用:
統計モデル: 回帰分析や時系列予測などの統計モデルを構築するのに適しています。
データ探索: データの可視化や探索的データ分析(EDA)が簡単です。
機械学習: caret や randomForest などのパッケージがあり、基本的な機械学習には対応していますが、深層学習には限界があります。

Python言語

用途: 汎用プログラミング言語で、データサイエンスから機械学習、深層学習まで幅広く対応しています。
AIへの適用:
機械学習: scikit-learn で様々なアルゴリズムを試せます。
深層学習: TensorFlow や PyTorch などのライブラリがあり、高度な深層学習モデルを構築できます。
データ処理と可視化: pandas でデータ操作、matplotlib や seaborn でデータ可視化が可能です。

比較

機械学習:

R: 統計モデルの構築が得意で、機械学習も基本的には対応しているが、深層学習には限界がある。
Python: 幅広い機械学習および深層学習ライブラリが利用でき、最新の技術にも対応している。

データビジュアライゼーション:

R: 高度なデータビジュアライゼーションが可能で、特に ggplot2 が強力。
Python: matplotlib や plotly でインタラクティブな可視化ができる。

エコシステム:

R: 統計解析とデータサイエンスに特化したツールが豊富。
Python: 幅広い分野に対応するライブラリがあり、AI・ML・データサイエンス全般に強い。

AIプロジェクトにおいては、Pythonがより多機能で、機械学習や深層学習に対応できるため、一般的にはPythonが好まれることが多いです。ただし、統計解析やデータ可視化のためにRを利用することもあります。

AI時代の認知的不協和

認知的不協和(cognitive dissonance)とは、人が自身の認知とは別の矛盾する認知を抱えた状態、またそのときに覚える不快感を表す社会心理学用語。
AIの処理での問題点を書きます。

1. 感情の理解の限界

認知的不協和は主に人間の感情や不快感に関する心理学的な概念です。AIは感情を体験したり、感情に基づく判断を下したりすることができないため、認知的不協和の微妙な心理的側面を十分に理解・説明できない場合があります。

2. 文脈依存の解釈

認知的不協和は状況や個人の認知に依存するため、特定の文脈に応じた解釈が必要です。AIは文脈を適切に考慮せずに一般的な解釈を提供することがあり、これが不正確な説明につながる可能性があります。

3. 複雑な心理プロセスの簡略化

AIは複雑な心理学的プロセスを単純化しすぎる傾向があります。認知的不協和のプロセスは多くの要素が絡み合っているため、AIがこれを過度に単純化すると、誤解を招く可能性があります。

4. 個別事例の誤解

認知的不協和は個別の事例や個人の状況に強く依存しますが、AIは個別事例に対して一般化した回答をすることがあります。これにより、具体的な状況に適したアドバイスや説明が提供できない場合があります。

5. 新たな認知の追加の理解の難しさ

認知的不協和の解消方法として「新たな認知の追加」がありますが、AIはこの過程を適切にシミュレートすることが難しいです。AIは人間がどのように新たな認知を形成し、不協和を解消するのかを理解するのに限界があります。

6. 倫理的問題への対応

認知的不協和はしばしば倫理的な問題と絡むことがあります。AIが倫理的判断を行う際には限界があり、不適切な解決策やアドバイスを提示するリスクがあります。例えば、AIが不適切な「認知の修正」を提案することがあり得ます。

これらの点が、認知的不協和に関する情報や概念をAIが正確に扱う上での主な問題点です。

飛んでモンテカルロの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億回処理してみる、こんなグラフになります。どんどん、理想の数値に収束していきます。

AI系の環境をDockerにして、複数環境を

Dockerにする理由

AI系の開発をしている中で、勢いあまって、複数の機能を同じ環境にいれてしまい、整理できない。
音声処理、画像処理、統計予想処理を同じ環境に入れてしまうと後で分離して、開発が不可能になる。
Dockerでわける。
https://www.docker.com/

ひとまず、jetson nanoから

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml
l4t-ml:r35.2.1-py3を使ってみます。

環境

まずは、環境を最新にします。
sudo apt update
sudo apt upgrade -y
mkdir data
cd data
mkdir l4t-ml-r35
cd l4t-ml-r35

docker自体は事前にはいっていると思うので、コンテナ指定して環境取得するシェルを書く
vi rundocker.sh

xhost +

sudo docker run \
    -it \
    --rm \
    --net=host \
    --runtime nvidia \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix/:/tmp/.X11-unix \
    -v ${PWD}:/data \
    nvcr.io/nvidia/l4t-ml:r35.2.1-py3

実行権限に変更
chmod a+x rundocker.sh

実行
./rundocker.sh

Status: Downloaded newer image for nvcr.io/nvidia/l4t-ml:r35.2.1-py3
allow 10 sec for JupyterLab to start @ http://192.168.158.57:8888 (password nvidia)
JupterLab logging location: /var/log/jupyter.log (inside the container)

起動しているかを確認

ブラウザで
http://192.168.158.57:8888
パスワード:nvidia
でアクセス

コマンドで
# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
147cb497e537 nvcr.io/nvidia/l4t-ml:r35.2.1-py3 “/bin/sh -c ‘/bin/ba…” 40 minutes ago Up 39 minutes competent_saha

AI系のライブラリーのmakeで謎のエラーのとき

AI系のライブラリーのmakeで謎のエラーのとき・・・
ファイルがあるのに、ファイルがないとか、ライブラリのバージョンが違うとか・・・
実際にはあっているのに、エラーになることがあります。
リソース不足でのエラーが多いと思うので、makeする前に
やっておきましょう。

stack sizeを制限なしにしておく。
# ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13907
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 13907
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

# ulimit -s unlimited
aoki@ai-desktop:~$ ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13907
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 13907
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

無限値の設定
https://www.ibm.com/docs/ja/wca/3.5.0?topic=tasks-setting-ulimit-values

linuxでCUDA変更12から10へupdate-alternatives

jetson_releaseでみると12シリーズになっている。
しかし、環境パスは10シリーズで統一したのに・・・
とおもっている方、多いと思います。

システムで使われるプログラムのバージョン管理を行うための
update-alternatives
を使います。

$ sudo update-alternatives –config cuda

alternative cuda (/usr/local/cuda を提供) には 2 個の選択肢があります。

  選択肢    パス                優先度  状態
------------------------------------------------------------
* 0            /usr/local/cuda-12.1   121       自動モード
  1            /usr/local/cuda-10.2   102       手動モード
  2            /usr/local/cuda-12.1   121       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してく ださい: 1
update-alternatives: /usr/local/cuda (cuda) を提供するためにマニュアルモードで /usr/local/cuda-10.2 を使います
aoki@ai-desktop:~$ sudo update-alternatives --config cuda
alternative cuda (/usr/local/cuda を提供) には 2 個の選択肢があります。

1を選びます。

  選択肢    パス                優先度  状態
------------------------------------------------------------
  0            /usr/local/cuda-12.1   121       自動モード
* 1            /usr/local/cuda-10.2   102       手動モード
  2            /usr/local/cuda-12.1   121       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してく ださい:

jetson_releaseを実行すると、
Libraries: – CUDA: 10.*.*
になっていると思います。

PHPでChatGPT3.5のAPIをつかって、一文字づつ表示するサンプル

PHPでChatGPTでAPIを叩いてみたいけど・・・・面白くしたい方へ。
ChatGPTのブラウザ画面のように一文字出てくるサンプルです。
ChatGPT3.5のAPIのキーを取得して、試してみてください。

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
 function send_prompt($prompt = '')
{
	$API_KEY = '*************************************************';//ここにキーを入れてね。

	if (!$prompt) {
		return;
	}

	$headers = array(
		'Content-Type: application/json',
		'Authorization: Bearer ' . $API_KEY
	);

	$data = array(
		'model' => 'text-davinci-003',
		'prompt' => $prompt,
		"max_tokens" => 500,
		"temperature" => 1,
		"top_p" => 1,
		"frequency_penalty" => 0.0,
		"presence_penalty" => 0.6,
		"stop" => array(".", "!", "?") // 終了文字を調整します
	);

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/completions');
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$response = curl_exec($ch);
	curl_close($ch);

	$response_data = json_decode($response, true);
	
	return trim($response_data['choices'][0]['text']);
}

$prompt = 'こんにちは、質問していいですか?';//ここに質問を書いてね
$chat_text = send_prompt($prompt);
echo '
   <script>
        document.addEventListener("DOMContentLoaded", function () {
            const text = \'こんにちは、私はChatGPTです。'.$chat_text.'\';//ここは回答です、アレンジしてね
            const outputElement = document.getElementById(\'output\');
            const typingDelay = 200; // ミリ秒単位でのタイピングの遅延

            function typeText(index) {
                if (index < text.length) {
                    outputElement.innerHTML += text.charAt(index);
                    setTimeout(() => typeText(index + 1), typingDelay);
                }
            }

            typeText(0);
        });
    </script>

    <div id="output"></div>
    ';

?>