AIうぉ--!(ai-wo-katsuyo-shitai !)

AIを上手く使ってみせたい!!自分なりに。

transformersからみた(のrequestする)tokenizersとかのバージョン

単に、setup.pyで確認

transformersのバージョン transformersリリース日 tokenizersのバージョン その他のバージョン
v2.11.0 Jun 2, 2020 tokenizers == 0.7.0
v3.0.0 Jun 30, 2020 tokenizers == 0.8.0-rc4
v4.0.0 Dec 1, 2020 tokenizers == 0.9.4
v4.10.0 Aug 31, 2021 tokenizers>=0.10.1,<0.11 "torch>=1.0","tensorflow-cpu>=2.3","tensorflow>=2.3","unidic>=1.0.2","unidic_lite>=1.0.7","numpy>=1.17"
v4.19.0 May 12, 2022 tokenizers>=0.11.1, !=0.11.3,<0.13 "torch>=1.0", "tensorflow-cpu>=2.3","tensorflow>=2.3","unidic>=1.0.2","unidic_lite>=1.0.7","numpy>=1.17"
v4.22.0 Sep 15, 2022 tokenizers>=0.11.1,!=0.11.3,<0.13 "torch>=1.0,!=0.12.0","tensorflow-cpu>=2.3","tensorflow>=2.3","unidic>=1.0.2","unidic_lite>=1.0.7","numpy>=1.17"
v4.31.0 Jul 19,2023 tokenizers>=0.11.1,!=0.11.3,<0.14 "torch>=1.9,!=1.12.0","tensorflow-cpu>=2.6,<2.14","tensorflow>=2.6,<2.14",,"unidic>=1.0.2",
"unidic_lite>=1.0.7","numpy>=1.17"

コメント

役立つかな。。。。

『AIのバックプロパゲーションには、勾配降下法が用いられますが、ニュートン法を用いることはできませんか?』に対するChatGPT(3.5)の回答が、普通に立派過ぎる!

ChatGPT(3.5)との質疑 (文字化け=数式部分は、画を前か後ろに貼りました)

User

AIのバックプロパゲーションには、勾配降下法が用いられますが、ニュートン法を用いることはできませんか

ChatGPT

はい、AIのバックプロパゲーションには通常勾配降下法が広く用いられていますが、ニュートン法を用いることも一部の場合で可能です。 勾配降下法は、誤差関数を最小化するために、現在のパラメーターの勾配を計算し、その勾配の逆方向に一定のステップサイズ(学習率)を進んでいく方法です。これは比較的シンプルで、大規模なデータセットや複雑なモデルにも適用しやすい利点があります。 一方、ニュートン法はより高度な最適化手法であり、二次導関数(ヘッセ行列)を用いて誤差関数を近似的に最小化します。勾配降下法よりも収束が速いことがあるため、勾配降下法よりも効率的な解の探索が可能です。 しかし、ニュートン法を用いる際には、以下のようないくつかの課題があります。

  1. 計算コスト: ニュートン法では、二次導関数(ヘッセ行列)の計算が必要となります。この計算は勾配降下法よりもコストが高く、特に大規模なデータセットや高次元のパラメータ空間では計算が困難となることがあります。

  2. ヘッセ行列の逆行列: ニュートン法では、ヘッセ行列の逆行列を計算する必要があります。この逆行列が存在しない場合や、数値的に安定しない場合があります。

  3. 局所最適解: ニュートン法は局所的な最適解に収束する可能性が高く、全体的な最適解に収束しないことがあります。特に非凸な誤差関数ではこの問題が起こりやすいです。 これらの課題のため、ニュートン法は一般的にニューラルネットワークの学習には直接適用されることは少なく、勾配降下法の派生手法(例:確率的勾配降下法、ミニバッチ勾配降下法、Adamなど)が主に使われます。 ただし、一部の特殊な問題や小規模なデータセットであれば、ニュートン法やその派生手法を適用しても良い結果を得ることがあります。ただし、その際には計算コストや局所最適解への対処に注意する必要があります。

User

AIのバックプロパゲーションで、ニュートン法を用いるために二次導関数数値計算で求めようとした場合、勾配降下法と比較してどのように手順というか実装方法が変わりますか?

ChatGPT

ニュートン法を用いるためには、二次導関数(ヘッセ行列)を数値計算で求める必要があります。勾配降下法と比較して、ニュートン法の実装方法では以下のような違いがあります。

  1. 勾配の計算: 勾配降下法では、各パラメータに関する誤差関数の一次導関数偏微分)を計算します。一方、ニュートン法では、ヘッセ行列を使用するために、各パラメータに関する誤差関数の二次導関数偏微分偏微分)を計算する必要があります。

  2. ヘッセ行列の計算: ニュートン法では、ヘッセ行列を数値計算で求める必要があります。ヘッセ行列は、誤差関数の各パラメータの交差偏微分から成る行列です。具体的には、各パラメータの組み合わせに対して、二次偏微分を計算してヘッセ行列を構築します。

  3. 更新の計算: 勾配降下法では、各パラメータを勾配の逆方向に一定の学習率で更新します。一方、ニュートン法では、ヘッセ行列の逆行列を使ってより正確な更新を行います。具体的には、以下の式でパラメータを更新します。

�new=�old−�−1∇�(�old)θnew=θold−H−1∇J(θold) ここで、�newθnew は更新後のパラメータ、�oldθold は現在のパラメータ、∇�(�old)∇J(θold) は現在の勾配、�H はヘッセ行列の逆行列です。

  1. ヘッセ行列の逆行列の計算: ヘッセ行列の逆行列を求めることは、一般的に数値的に安定しない場合があります。特に、ヘッセ行列が正定値でない場合には逆行列が存在しないため、別の手法を用いる必要があるかもしれません。 これらの手順は、ニュートン法バックプロパゲーションに適用する場合に必要となる主な変更点です。ただし、ニュートン法の実装は数値的に安定しない場合があるため、実際にはより高度な最適化手法や近似手法を用いることが一般的です。例えば、準ニュートン法共役勾配法などが使われることがあります。

User

ありがとうございます。後半の処理を一旦無視して、前半の二次導関数の計算方法を具体的に教えて下さい。どう数値計算したらよかったでしょうか。一次導関数の算出との比較で教えて下さい。

ChatGPT

二次導関数(ヘッセ行列)を数値計算する方法には、中心差分近似を使うことが一般的です。この方法は、一次導関数(勾配)を数値計算する方法(前方差分または中心差分)に類似していますが、より高次の微分を近似するために必要な手法です。 具体的には、中心差分近似を用いて各パラメータに関する二次導関数を求めます。以下に、一次導関数の計算と比較しながら、中心差分近似による二次導関数の計算方法を示します。

  1. 一次導関数(勾配)の計算(中心差分): 一次導関数を計算するためには、誤差関数をパラメータの各次元について微小な変化させたときの誤差の変化を見る必要があります。中心差分では、次のように計算します。 ∂�∂��≈�(��+�)−�(��−�)2�∂θi∂J≈2ϵJ(θi+ϵ)−J(θi−ϵ) ここで、��θi はパラメータのi番目の次元、�ϵ は微小な値(例:0.001など)です。この方法により、勾配を近似的に計算することができます。

  2. 二次導関数(ヘッセ行列)の計算(中心差分近似): 二次導関数を計算するためには、中心差分を二回行うことで近似します。具体的には、次のように計算します。 ∂2�∂��2≈∂�∂��(��+�)−∂�∂��(��−�)2�∂θi2∂2J≈2ϵ∂θi∂J(θi+ϵ)−∂θi∂J(θi−ϵ)

この方法により、各パラメータの次元に関する二次導関数を近似的に計算することができます。 上記の手法を使って、各パラメータに関する二次導関数を計算し、それらを組み合わせることでヘッセ行列を構築します。ただし、中心差分近似は数値的な誤差が生じるため、正確な二次導関数を求めることは難しい場合があります。そのため、より高度な数値計算手法や解析的な方法を用いることがあります。

User

バックプロパゲーションで、上記に示して頂いた「一次導関数(勾配)の計算(中心差分)」のような計算はしないと思いますが、Fowardの計算とかとの関係で、もっと簡略化されていましたかね。

ChatGPT

申し訳ありません、私の回答が混乱を招くかもしれませんでした。バックプロパゲーションにおいて、一般的にはニュートン法によるヘッセ行列の数値計算は行われません。二次導関数を計算する際には、通常の勾配降下法やその派生手法で用いられる一次導関数の計算(勾配の計算)を行うだけです。 具体的に、バックプロパゲーションにおいては以下の手順を通じて勾配の計算が行われます:

  1. Forward Pass: 入力データを順伝播させ、ネットワークの出力を計算します。この際、各層の中間出力や活性化関数の結果を保存しておきます。

  2. Loss Function: 出力と正解ラベルとの誤差を表す損失関数を計算します。

  3. Backward Pass: ネットワークの出力から入力まで逆伝播させ、各パラメータに関する損失関数の勾配を計算します。この際、連鎖律を用いて各層の勾配を計算します。

  4. 勾配の適用: 計算された勾配を使って、各パラメータを更新します。通常、勾配降下法やその派生手法を用いてパラメータを更新します。 ニュートン法によるヘッセ行列の数値計算を行う必要はありません。代わりに、通常のバックプロパゲーションでは一次導関数(勾配)の計算が中心的な役割を果たします。

ニュートン法を用いる場合は、勾配降下法とは異なる手順として、私が前回説明したような二次導関数の計算やヘッセ行列の逆行列の計算が必要となります。しかし、一般的なバックプロパゲーションでは、これらの手順は使用されないことをご理解ください。バックプロパゲーションでは、勾配降下法やその派生手法を用いて効率的にネットワークの学習が行われます。

User

ですね。「連鎖律」と一個前に示して頂いた「一次導関数(勾配)の計算」の関係を教えて下さい。

ChatGPT

連鎖律(Chain Rule)は、合成関数の微分を計算するための基本的な微分法則です。バックプロパゲーションにおいて、連鎖律が一次導関数(勾配)の計算に関連して重要な役割を果たします。 ニューラルネットワークは、複数の層から構成される合成関数として表現されます。各層には重みとバイアスというパラメータがあり、これらのパラメータに対する損失関数の勾配(一次導関数)を計算することが重要です。ここで連鎖律が活躍します。

ニューラルネットワークの一つの層を考えてみましょう。この層の入力を �x、出力を �y、損失関数を �J とします。そして、この層の重みを �W、バイアスを �b とします。連鎖律によれば、損失関数 �J を重み �W で偏微分する際の式は次のようになります: ∂�∂�=∂�∂�⋅∂�∂�∂W∂J=∂y∂J⋅∂W∂y ここで、∂�∂�∂y∂J は �J を �y で偏微分したものであり、∂�∂�∂W∂y は �y を �W で偏微分したものです。 一般的に、ニューラルネットワークでは、各層の活性化関数として非線形関数が用いられます。このため、∂�∂�∂W∂y の計算は比較的容易で、その値は直接求めることができます。一方、∂�∂�∂y∂J の計算は、次の層から伝わってくる勾配を用いて計算されるため、バックプロパゲーションの過程で求められます。

つまり、連鎖律により、各層の勾配計算は、出力から逆向きに戻りながら、各層の局所的な勾配を掛け合わせていくことで行われるのです。このプロセスにより、最終的に損失関数に対する各パラメータの勾配が計算されます。 簡潔に言うと、連鎖律はニューラルネットワークにおいて、逆伝播の過程で各層の勾配を連結していくための基本的な法則です。これにより、勾配降下法を使って効率的にパラメータの更新が行われることになります。

コメント

凄いなーーーー。これ以上の回答になると、ワタシの理解度を忖度して、うまく回答で誘導してくれるとかになるのでしょうか。
もしくは、質問自体に質問して、質問(ワタシ)の精度をあげさせるなど。
ただ、これ以上、質問のダメな部分とかにうまく対応することは、逆にChatGPTの苦手領域のような気もする。。。。

Pytorch, LSTM(1個), sine波の推定(予想?)は、この記事のコードがシンプルかも。。。。

Pytorch, LSTM(1個), sine波の推定(予想?)

以下の記事のコードがシンプルだと思いました。 datahacker.rs

LSTMは、1個。

class myLSTM(nn.Module):
  def __init__(self, input_size=1, hidden_size=50, out_size=1):
    super().__init__()
    self.hidden_size = hidden_size
    self.lstm = nn.LSTM(input_size, hidden_size )
    self.linear = nn.Linear(hidden_size, out_size)
    self.hidden = (torch.zeros(1,1,hidden_size ) , torch.zeros(1,1,hidden_size)  )

補足説明

40プロット先まで予想していますが、、、

当然、1個づつの予想。予想結果をinputに回しているだけ。 末尾の行。

for i in range(future):
  seq = torch.FloatTensor(preds[-window_size:])
  with torch.no_grad():
 
    model.hidden = (torch.zeros(1,1,model.hidden_size), 
                    torch.zeros(1,1,model.hidden_size))
    
    preds.append(model(seq).item())

40プロット先まで予想していますが、、、

future = 40

上記と、

window_size = 40

は、別々の値を設定できる。グラフとかで、40決め打ちのところとかは、適当に修正要。

future = 240にした例

epoch=30

epoch=200

単純に(安定して)、epochを増やすと精度が上がっている

そういうもんなんだろう。

AIの用語。回帰(regression)という用語は、少し、ずれた意味なので注意。

Wikipediaによると

「回帰」という用語は、英語の「regression」からの翻訳であるが、元々は生物学的現象を表すために19世紀にフランシス・ゴルトンによって造られた。ゴルトンは、背の高い祖先の子孫の身長が必ずしも遺伝せず、平均値に戻っていく、すなわち「後退(=regression)」する傾向があることを発見した。これを「平均への回帰」という。ゴルトンはこの事象を分析するために「線形回帰(英: linear regression)」を発明した。ゴルトンにとって回帰はこの生物学的意味しか持っていなかったが、のちに統計学の基礎となり、「回帰(英: regression)」という用語も統計学へ受け継がれたのである。

URL:

ja.wikipedia.org

補足

  • 背の高い祖先の子孫の身長が必ずしも遺伝せず、平均値に戻っていく ⇒ 回帰
  • この事象を分析するために「線形回帰(英: linear regression)」を発明した

Wikipedia(英語)によると

「退行」という用語は、19世紀にフランシス・ガルトンが生物学的現象を説明するために作った造語である。その現象とは、背の高い祖先の子孫の身長が通常の平均に向かって後退する傾向があるというものであった(平均への回帰としても知られる現象)[7][8]。ガルトンにとって、回帰はこの生物学的な意味しか持たなかったが[9][10]、彼の研究は後にウドニー・ユールとカール・ピアソンによってより一般的な統計学的文脈に拡張された[11][12]。

tend to regress down towards a normal average

URL:

https://en.wikipedia.org/wiki/Regression_analysis

言葉通りの「後退」

Wikipedia(フランス語)によると

この言葉は、19世紀にフランシス・ガルトンが観察した平均への回帰に由来している。背の高い人の子供は、それ自身は平均的に母集団より背が高いが、両親(これも平均的に)より背が低く、母集団内の身長のばらつきが小さくなることはない2,3。この現象を定量化するために開発された技法は、統計応用のあらゆる分野で貴重な測定ツールを生み出した。

URL:

https://fr.wikipedia.org/wiki/R%C3%A9gression_(statistiques)

関連の自分の記事

ai-de-seikei.hatenablog.com

コメント

用語は、どこの領域でも、結構、荒れてますよね。。。

ちょっとなんでもいいので、Graph Neural Networksを動かしてみた

Graph Neural Networks

github.com

上記、書籍対応のGitHubでいろいろある。

Chapter14を動かしてみた

環境

windows10 python3.7 CPU

結果

以下みたいな図(他にも図あり)が、表示された。

使われているデータセット

TUDatasetのMUTAG

ChatGPT(3.5)に解説してもらうと。。。

User

from torch_geometric.datasets import TUDataset のTUデータセットとはなんですか

ChatGPT

torch_geometric.datasets.TUDatasetは、PyTorch Geometricというライブラリで提供されているデータセットの1つです。TUは"Technical University"(工科大学)の略称で、TUデータセットはグラフデータを用いた機械学習タスクにおいてよく使われるデータセットのファミリーを指します。

これらのデータセットは、主にグラフ分類(Graph Classification)のタスクに使用されます。グラフ分類は、入力として与えられたグラフを事前に定義されたカテゴリに分類する問題です。例えば、タンパク質の構造をグラフとして表現し、それがどのタンパク質ファミリーに属するかを分類する、あるいは化合物の分子構造をグラフとして表現し、その化合物の薬効や毒性を分類するなどがグラフ分類の具体的な応用例です。

torch_geometric.datasets.TUDatasetは、多くの異なるグラフデータセットを簡単にダウンロードしてロードするための便利なインターフェースを提供しています。それぞれのデータセットにはグラフの構造やカテゴリなどの情報が含まれており、機械学習モデルのトレーニングや評価に利用されます。このライブラリは、グラフニューラルネットワーク(Graph Neural Network, GNN)などのモデルの開発に広く使用されています。

User

ありがとうございます。そこでのMUTAGとは、どういうものでしょうか。

ChatGPT

MUTAG(MutaGraphs)は、TUDataset(Technical University Dataset)の1つであり、グラフ分類タスク用の有名なデータセットの1つです。具体的には、化学的な分子をグラフとして表現したものです。

MUTAGは、窒素と水素の原子から成る芳香族アミンの異なる化合物のセットから構成されています。それぞれの化合物は、グラフのノードとエッジを使って表現されます。ノードは原子を表し、エッジは原子間の結合を表します。そして、これらの化合物は2つのクラスに分類されます:発癌性があるかないかを示す2つのクラス(0と1)に分類されます。

このようなグラフ分類タスクでは、グラフの構造や原子の配置が分類に重要な役割を果たすため、グラフニューラルネットワーク(GNN)などの特殊なニューラルネットワークアーキテクチャが利用されることが一般的です。MUTAGは、グラフ分類の性能評価やGNNのモデルの検証などに広く使用されています。

補足

エラー対応した内容は、自分のこちらの記事をみて下さい。

keep-loving-python.hatenablog.com

コメント

不明点などあれば、コメントなど下さい。

BERTは。何をデータとして事前学習しているのか?

答えが0秒で沢山えられます。。。。反省。

Wikipediaによると

(両モデルとも、)Toronto BookCorpus[12](8億語)と、英語版Wikipedia(25億語)で事前訓練された。

引用元:

https://ja.wikipedia.org/wiki/BERT_(%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB)

そもそものBertの論文によると

Pre-training data The pre-training procedure largely follows the existing literature on language model pre-training. For the pre-training corpus we use the BooksCorpus (800M words) (Zhu et al., 2015) and English Wikipedia (2,500M words).

https://arxiv.org/pdf/1810.04805.pdf

ちなみに、XLNetは

3.1 Pretraining and Implementation Following BERT [10], we use the BooksCorpus [40] and English Wikipedia as part of our pretraining data, which have 13GB plain text combined. In addition, we include Giga5 (16GB text) [26], ClueWeb 2012-B (extended from [5]), and Common Crawl [6] for pretraining. We use heuristics to aggressively filter out short or low-quality articles for ClueWeb 2012-B and Common Crawl, which results in 19GB and 110GB text respectively. After tokenization with SentencePiece [17], we obtain 2.78B, 1.09B, 4.75B, 4.30B, and 19.97B subword pieces for Wikipedia, BooksCorpus, Giga5, ClueWeb, and Common Crawl respectively, which are 32.89B in total.

https://arxiv.org/pdf/1906.08237.pdf

いろんなモデルについて知りたければ、以下のサーベイ論文が。。。お薦め

https://arxiv.org/pdf/2108.05542.pdf

Kalyan, Katikapalli Subramanyam, Ajit Rajasekharan, and Sivanesan Sangeetha. "Ammus: A survey of transformer-based pretrained models in natural language processing." arXiv preprint arXiv:2108.05542 (2021).

コメント

アドバイスやコメントなどあれば、なんなりと。。。。
この記事は、0秒情報でした!!!

ChatGPT。知識量巨大(博識)ですが、知識がちょっとフワッとし過ぎでは。

知識量巨大(博識)ですが、知識がちょっとフワッとし過ぎでは。

結果1

ChatGPT 正解 評価
W0613 - Unused argument unused-argument 正解
W0612 - Unused variable unused-variable 正解
C0116 - Missing function or method docstring missing-function-docstring ちょっと、違う
W0404 - Reimport * from module reimported ちょっと、違う
C0103 - Invalid name invalid-name 正解

※正解は、pylintの3.0と、ChatGPTの知識が古いことはあるので2.6の両方で確認した(差異なし)

この結果(表)から言えること。

指摘を表現する「文言」が正確に把握できていない!!!

結果2

ChatGPT 正解 評価
C0111: Missing module, class, method docstring umissing-docstring ちょっと、違う
C0103: Invalid name invalid-name 正解
W0611: Unused import unused-import 正解
W0622: Redefining built-in redefined-builtin ちょっと、違う
E0401: Import error import-error 正解

※正解は、pylintの3.0と、ChatGPTの知識が古いことはあるので2.6の両方で確認した(差異なし)

この結果(表)から言えること。

指摘を表現する「文言」が正確に把握できていない!!!

結果1と結果2をあわせて

両者で共通なものがC0103しかないのも、いい加減すぎる!!

自分の関連記事

関連というか、この記事の結果を利用しました↓↓ ai-de-seikei.hatenablog.com

コメント

ちょっと、ChatGPTをでぃすりました、今回も。