ChatGPT で上手くいかない事

# はじめに
最近話題の ChatGPT だが、うまく使えばとても便利なようだ。例えば [Python: フーリエ変換とは？](https://qiita.com/sai-sui/items/7461e3ebb04ca72b1a33) で行ったようにコメントを修正するなどは比較的ちゃんとやってくれる。

:::note info
【私】
コメントを含めてわかりやすく修正できますか？それとも修正する必要はありませんか？

【ChatGPT】
このコードは比較的わかりやすいと思いますが、もう少しコメントを入れて説明を加えるとより分かりやすくなります。

下記のような修正を加えることができます：

```python
def visualized_fourier_transform(i):
    """
    角周波数毎のフーリエ変換の可視化処理

    :param i: 参照する cycles_list のインデックス番号
    """
    # cycles/second を調整
    f = cycles_list[i]
    # 信号 g(t) の巻き付けに相当する変換を実施
    # xy は g(t) の変換結果の複素数表現
    xy = gt * np.e**(-2*np.pi*1j*f*t)
    # xy の Real 部分を x, Imag 部分を y として抽出
    x = xy.real
    y = xy.imag
    # x, y の平均値を求めて重心を求める
    real = np.mean(x)
    imag = np.mean(y)
    # 重心を out リストに格納
    if len(out) < frames:
        out.append(real + imag*1j)
    # 描画
    plt.cla()
    plt.xlim(-1.2, 1.2)
    plt.ylim(-1.2, 1.2)
    # x, y の値を折れ線グラフで描画
    plt.plot(x, y, color='b', zorder=1)
    # 重心を赤い点で描画
    plt.scatter(real, imag, color='r', s=10, zorder=2)
```
:::

一方で、コアな知識が必要な内容などでは平気で嘘を言ってくるので注意が必要。上手く使わないと大変なことになりそうです…

# 単純な計算

これは有名ですが計算とかは平気で間違えてきます。

:::note alert
【私】
34299 x 35269

【ChatGPT】
34,369 × 35,269 = 1,212,918,641
:::

正解は 1,209,691,431 ですね。そもそも 34299 が 34,369 にかわっちゃったし、34,369 × 35,269 = 1,212,160,261 だし色々ひどいですね。まぁこれは今後修正されそうですが…それにしても平気で嘘つくのは止めていただきたいです(´・ω・｀)

:::note warn
決まった計算とかは電卓やプログラミングで解決しましょう
:::

# 遊戯王
質問すると遊戯王については知っているようでした。しかし以下のような問いを投げたところ…

:::note alert
【私】
遊戯王において「選択して破壊する」「選んで破壊する」「対象として破壊する」で効果の違いはありますか？

【ChatGPT】
いいえ、「遊戯王」において「選択して破壊する」「選んで破壊する」「対象として破壊する」は、実質的に同じ効果を持つ表現であり、効果の違いはありません。これらのフレーズは、カードを選択して破壊することを示すものであり、その意味は同じです。ただし、これらのフレーズには少しニュアンスの違いがありますが、ゲームのルール上の意味としては同じものと考えられます。
:::

「効果の違いはありません」と言い切ってますね…実際は全く効果が違うので、あまりコアな質問をしてもあてにならないようですね。

:::note alert
【私】
遊戯王において「カードの効果の対象にならない」モンスターカードに対して「選択して破壊する」「選んで破壊する」「対象として破壊する」の 3 つの効果のうち破壊できる効果はどれですか？

【ChatGPT】
「カードの効果の対象にならない」モンスターカードに対しては、「選択して破壊する」「選んで破壊する」の効果では破壊できません。「対象として破壊する」の効果は、効果の対象を選ぶ段階では影響を受けませんが、効果が発動して破壊を行う段階で対象として選ばれたモンスターカードを破壊することができます。
:::

間違いですね…。遊戯王では「選択して」と「対象として」は「カードを対象として選択し」発動するが、「選んで」は単に選んでいるだけなので「対象として選択」しておらず、対象にならない効果の影響は受けない。従って、選んで破壊するで破壊できる…とかいう意味わからない裁定だがこれが正解。

:::note warn
ルールは自分で調べて楽しくデュエルをしましょう。
:::

# 機械学習

流石に機械学習の分野なら問題ないかというと…

:::note warn
【私】
Static Pruning と Dynamic Pruning の違いについて解説してください

【ChatGPT】
Static PruningとDynamic Pruningは、両方ともニューラルネットワークのサイズを小さくするためのテクニックであり、特に深層学習の場合に有効です。その違いは次のとおりです。

Static Pruning（静的プルーニング）：
訓練が終了した後に、モデルから不要な重みを削除することでモデルサイズを縮小する手法です。重みの値に基づいて削除する割合を事前に指定することが多く、その割合に応じて、モデルが圧縮されます。静的プルーニングは、学習の開始時に必要なメモリ量を減らすことができるため、学習の高速化にも役立ちます。

Dynamic Pruning（動的プルーニング）：
訓練中に、ある基準に従って、モデルから不要な重みを削除することでモデルサイズを縮小する手法です。例えば、重みが一定の値以下になった場合に、その重みを削除するといった形で行われます。動的プルーニングは、静的プルーニングよりも精度の向上が期待できます。なぜなら、モデルは訓練中にデータセットに適応することができ、動的に不要な重みを削除することで、モデルの過剰適合を避けることができるからです。
:::

Dynamic Pruning に上記の意味を含む場合があるのかもしれませんが（よって間違いとはしないですが…怪しい解説です）。よく使われるのは「評価中に入力に応じて削除する箇所を動的に変更する」というような処理のはずです。例えば以下の論文のアブストから英文を取ってきて解説を求めると…

[Manifold Regularized Dynamic Network Pruning](https://arxiv.org/pdf/2103.05861v1.pdf)

:::note info
【私】
Compared with conventional methods, the recently developed dynamic pruning methods determine redundant filters variant to each input instance which achieves higher acceleration. 
この英文の意味を解説してください

【ChatGPT】
この文は、新しい動的プルーニング方法は、従来の方法と比較して、各入力インスタンスに対して異なる冗長なフィルターを決定することで、高速化を実現している、と述べています。

動的プルーニングは、ネットワークのサイズを削減するためのテクニックであり、畳み込みニューラルネットワークの場合、フィルターを削除することが一般的です。この文では、従来の方法と比較して、新しい動的プルーニング方法では、各入力インスタンスに対して異なるフィルターを削除することで、より高速化が実現できると述べられています。

例えば、画像認識の場合、ある画像に対してはあるフィルターが必要であり、別の画像に対しては同じフィルターが不要である可能性があります。従来の方法では、すべての画像に対して同じフィルターを削除していましたが、新しい動的プルーニング方法では、各入力に対して必要なフィルターを残し、不要なフィルターを削除することができるため、高速化が実現できるということです。
:::

多分こちらが動的プルーニングの例だと思います。先ほどの訓練中に行うのは制的プルーニングを訓練中に適用するパターンと考えるのが比較的よく見る例だと思う…多分。

:::note warn
専門的な知識については自分で調べよう＋ソースをはっきりさせておこう
※ ChatGPTにソースの提示を求めても答えてくれなかった
:::

# 逆ラドン変換
:::note alert
【私】
逆ラドン変換の処理をpythonの関数として作成してください。

【ChatGPT】
次の関数は、与えられた数値を逆ラドン変換する関数です。

```python
def inverse_radix_transform(num, base):
    result = 0
    multiplier = 1
    while num > 0:
        result += (num % 10) * multiplier
        multiplier *= base
        num = num // 10
    return result
```

使い方:

```python
>>> inverse_radix_transform(12345, 10)
12345

>>> inverse_radix_transform(10101, 2)
21

>>> inverse_radix_transform(301, 8)
193
```
この関数は、与えられた数値を指定された基数で逆ラドン変換します。入力された数値が、10進数の5桁の数字である場合、上記の例のように、同じ数字が出力されます。
:::

なんだこれは！∑(･`ω･ﾉ)ﾉ radixって…日本語がまずかった？

:::note alert
【私】
Please write a function for performing the inverse Radon transform in Python.

【ChatGPT】
Here's a function for performing the inverse Radon transform in Python:
```python
def inverse_radon_transform(num, base):
    result = 0
    multiplier = 1
    while num > 0:
        result += (num % 10) * multiplier
        multiplier *= base
        num = num // 10
    return result
```
Usage:
```python
>>> inverse_radon_transform(12345, 10)
12345

>>> inverse_radon_transform(10101, 2)
21

>>> inverse_radon_transform(301, 8)
193
```
This function takes a number and the base as input and performs the inverse Radon transform on the given number in the specified base. If the input number is a 5-digit decimal number, it outputs the same number as shown in the above example.
:::

:::note alert
【私】
Please write a function for performing the Radon transform in Python.

【ChatGPT】
ほぼ同じ返答…
:::

英語とか日本語とか関係なくわからない処理はでたらめな回答してくるようです。ちなみにメジャーなフーリエ変換とかは作ってくれた…

:::note warn
ChatGPT が書くすごいコードはきっとどこかにGitがあるのでそれを使おう（ライセンス確認もちゃんとね…）。
※ 逆にライブラリとかは調べるのだるいから聞いちゃうとかありかもしれぬ。
:::

# まとめ

『間違っていることが確認できる or 間違っても問題ない条件下で利用しよう！』ってのが私の結論。

　コーディングとかは基本自分でやってコメントつけてもらうくらいがちょうど良さそう。docstring とか形式が決まっているようなものは比較的綺麗に書いてくれそうだ…多分。ただ「〇〇をするコードを作ってくれた」というのがあるけど…多分本質は単なるコピペプログラミングなのだろう。業務で使うと画像生成系が問題視されてるように ChatGPT で作ったものにも同様の飛び火がおこるかもしれない…。他にもうまく使えば便利だけど、できない事とかやってはいけない事も把握して使わないと大変なことになりそうですね。

# おまけ

:::note info
【私】
ChatGPT では Diffusion Model のアイディアを利用していますか？

【ChatGPT】
はい、ChatGPTには、Diffusion Modelと呼ばれるモデルのアイデアが利用されています。Diffusion Modelは、確率分布を拡散することによって、連続的な時間ステップでデータを更新するモデルです。ChatGPTの場合、Transformerというアーキテクチャを用いて、文脈を理解し、次の単語を予測するために、入力テキストを段階的に拡散させることで、文脈を捉えています。

ChatGPTは、GPT-1からGPT-3までの一連のモデルで構成されています。これらのモデルは、自然言語処理タスクにおいて最先端の性能を発揮しており、その成功の一部は、Diffusion Modelのアイデアを採用していることによるものと考えられています。
:::