佐藤さん卒論
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[技術資料]]
大規模言語モデルに組み込む動的適応プルーニングの提案手法
*目次 [#e890b3d5]
#CONTENTS
*目的 [#x38aa8d3]
莫大なパラメータを保持するLLMは、推論時間や消費電力に課題...
理由として、不必要なパラメータも計算リソースとして含まれ...
そのため、本研究の目的はそのような不必要なパラメータを削...
*使うモジュールのインストール [#u1248302]
***使用するモジュール [#ta19c6d2]
|モジュール|version|用途|
|torch||PyTorchはLlama2のような大規模言語モデルのトレーニ...
|transformers||モデルの読み込み、トレーニング、評価|
|datasets||データセットのロードと前処理|
|accelerate||分散学習や混合精度トレーニング|
|bitsandbytes||量子化トレーニングや8ビット最適化に利用.|
|scipy||統計的な操作や最適化に利用|
|optimum|| Hugging Faceのエコシステムで、モデルの最適化(...
モジュールのインストールはコマンドプロンプトでpip install...
バージョンまで指定する場合はコマンドプロンプトでpip insta...
でインストールする
*事前学習モデル、データセットのダウンロード [#ob3ca958]
**huggingfaceとは [#v2c613db]
スクレイピングを用いてデータを収集する.
スクレイピングには「selenium」を用いる.
seleniumのバージョンについては上で示した通りである.
seleniumではクリックなどのユーザーアクションを模倣するこ...
スクレイピングをする部分のコードはこれ↓
#ref(scraping.py,,スクレイピング用コード)
#ref(スクレイピング流れ.PNG.jpg)
今回は日本銀行時系列統計データ検索サイトを例に説明する.
日本銀行時系列統計データ検索サイトではクリックアクション...
ダウンロードしたデータはcsv形式でダウンロードされる.
そのため,ダウンロードされたcsvファイルを一つのフォルダに...
また,ダウンロードした時点のファイル名もダウンロードされ...
そのためにまず,ファイルのダウンロード先を指定する必要が...
dldir_path = Path('保存先のフォルダのパス')
dldir_path.mkdir(exist_ok=True)
download_dir = str(dldir_path.resolve())
options.add_experimental_option('prefs', {'download.defa...
また,ファイル名を変更するコードとして以下を追加する.
filename_list=["変更後のファイル名(1)","変更後のファイル...
list_of_files = glob.glob('保存先のフォルダのパス/*')
latest_file = max(list_of_files, key=os.path.getctime)
file_name = str(latest_file.split('\\')[1])
print(latest_file)
print()
os.remove("csv/"+filename_list[i-1])
os.rename(latest_file,"csv/"+filename_list[i-1])
**APIを用いたモデルのダウンロード [#xbcf3848]
・API作成
hugging face(URL:https://huggingface.co/)のwebページ...
・API作成後モデルのダウンロード
実行環境にて下記のコマンドを入力にて
huggingface-cli login
右クリックで貼り付け
分析するためにはデータの前処理を行わなければ正しい結果は...
今回は前処理の手法として正規化を行う.
正規化の手法として,VAR-LiNGAMではMin-Max法によるデータの...
*VAR-LiNGAMへの適用 [#eb3cce83]
VAR-LiNGAMの分析ではPythonのモジュール「LiNGAM」のVAR-LiN...
これはhttps://lingam.readthedocs.io/en/latest/tutorial/va...
path = "用いるデータのパス"
df=pd.read_csv(path,parse_dates=True,index_col="Day",enc...
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), c...
model = lingam.VARLiNGAM(lags=2, prune=True)
model.fit(normalized_df)
上のコードではデータの読み取り,正規化を行い,それについ...
labels = [f'{col}(t)' for i, col in enumerate(normalized...
make_dot(np.hstack(model.adjacency_matrices_),
lower_limit=0.05,
ignore_shape=True,
labels=labels
)
上のコードで2次元グラフを作成している.このコードは結果を...
graphvizのインストールについては以下のサイトを参考にした
https://www.kkaneko.jp/tools/win/graphviz.html
model = lingam.VARLiNGAM()
result = model.bootstrap(normalized_df,n_sampling=100)
これでLiNGAMのVAR-LiNGAMをモデルとして設定し,ブートスト...
ブートストラップ法では一般的に用いるデータのサンプル数よ...
p_values = model.get_error_independence_p_values()
これで誤差変数間の独立性を分析する.
cdc = result.get_causal_direction_counts(n_directions=8,...
split_by_causal_effect_sign=True)
このコードで因果関係の方向性を取得する.n_directionは上位...
print_causal_directions(cdc, 100, labels=labels)
でその結果を描画できる.
dagc = result.get_directed_acyclic_graph_counts(n_dags=3,
min_causal_effect=0.2, split_by_causal_effect_sign=True)
これではDAGのランキングを取得できる.また,
causal_effects = result.get_total_causal_effects(min_cau...
df = pd.DataFrame(causal_effects)
df['from'] = df['from'].apply(lambda x : labels[x])
df['to'] = df['to'].apply(lambda x : labels[x])
df
これで合計因果関係を取得することができ,この結果を用いて3...
#ref(ingakekka.PNG)
得られた因果性は上のような形式で保存される.
fromには影響を与えている要素,toには影響を与えられている...
一行ずつ因果の向きと大きさが格納されている
*数法則発見法(RF5法)によるモデル化 [#tdd1a952]
数法則発見法の1つであるRF5を用いて経済変数間のモデル化を...
RF5のプログラムは以下に貼っておく.
RF5では何度も反復を行い学習することでモデルを作成するため...
反復回数を設定する際にはwhile s < 500:の500の部分を反復し...
この反復回数は従来研究では10000回や20000回が望ましいと述...
実行して得られたBICが低ければ低いほど良い結果をとりやすい...
RFを実行する際はDriveのRF_real_experiment100.pyを実行すれ...
実行する際は実際に用いるデータを置き換える必要がある.
その際には169行目のpd.read_csv('データのパス(csv形式)')に...
データの形式の例を以下に示す.
#ref(data.png.jpg)
データの内容としては右端の列に目的変数,それ以外の列に説...
結果はtheta.csvに出力され,それをRF5の定式化に当てはめる...
以下にtheta.csvの中身を示す.
#ref(theta.jpg)
RF5の定式化は以下に示す.
#ref(RF_teishikika.png)
θは(w_0,w_j,w_jk)かなっている.
このθの中身がtheta.csvには格納され,これを用いて復元を行...
*因果3Dグラフの作成 [#s53cb794]
VAR-LiNGAMによって得られた結果から因果3Dグラフを作成する.
ここではVARLiNGAMで得られた合計因果関係を格納したcsvファ...
csvファイルは以下の形式で保存されており,以下のプログラム...
import pandas as pd
import json
from pyvis.network import Network
def kyoki_word_network():
got_net = Network(height="1000px", width="95%", bgcol...
got_data = pd.read_csv("ultra_kekka.csv")[:2000]
sources = got_data['from']
targets = got_data['to']
weights = got_data['effect']
unique_nodes = set(sources) | set(targets)
nodes = [{"id": node, "label": node, "title": node} f...
edges = [{"from": src, "to": dst, "color": 'red' if w...
nodes_json = json.dumps(nodes, ensure_ascii=False)
edges_json = json.dumps(edges, ensure_ascii=False)
html_code = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=ed...
<meta name="viewport" content="width=device-width...
<title>Your Network</title>
<style>
#mynetwork {
height: 1000px;
width: 95%;
border: 1px solid lightgray;
}
</style>
</head>
<body>
<div id="mynetwork"></div>
<script type="text/javascript" src="https://unpkg...
<script>
var container = document.getElementById("myne...
var nodes = new vis.DataSet(""" + nodes_json ...
var edges = new vis.DataSet(""" + edges_json ...
var data = {nodes: nodes, edges: edges};
var options = {};
var network = new vis.Network(container, data...
// ノードのダブルクリック用のイベントリスナー...
network.on("doubleClick", function (params) {
if (params.nodes.length > 0) {
var nodeId = params.nodes[0];
var nodeLabel = nodes.get(nodeId).lab...
// ページ遷移や他のダブルクリックされ...
window.location.href = "page/" + node...
}
});
</script>
</body>
</html>
"""
with open("your_network.html", "w", encoding="utf-8")...
html_file.write(html_code)
got_net.show_buttons(filter_=['physics'])
return got_net
kyoki_word_network()
jscode=""の部分でクリックアクションなどを設定している.
今回はダブルクリックしたときにページ遷移するようにした.
#ref(networka.PNG)
ここからノードをクリックすることで,ページ遷移を行う.
**3Dグラフによる可視化 [#u182dd73]
改善版としてグラフをよりアトラクティブにするシステムを作...
改善前ではノードを引っ張ることしかできていなかったが,ク...
その際にはthree.jsによる可視化を行い,アプリケーションの...
three.jsについては以下のサイトを参考にした.
https://github.com/vasturiano/3d-force-graph
以下に改善版のプログラムを示す.
const highlightLinks = new Set();
const highlightNodes = new Set();
let hoverNode = null;
const Graph = ForceGraph3D()
(document.getElementById("three"))
.jsonUrl('http://127.0.0.1:5000/static/output2.json')
.nodeColor('#ffffff')
.nodeLabel('id')
.nodeRelSize(20)
.nodeThreeObject(node => {
const sprite = new SpriteText(node.id);
sprite.material.depthWrite = false; // make sprit...
sprite.color = node.color;
sprite.textHeight = 7.5;
return sprite;
})
.linkThreeObject(link => {
// extend link with text sprite
const sprite = new SpriteText(`${link.value}`);
sprite.color = 'blue';
sprite.textHeight = 1.5;
return sprite;
})
.linkPositionUpdate((sprite, { start, end }) => {
const middlePos = Object.assign(...['x', 'y', 'z'...
[c]: start[c] + (end[c] - start[c]) / 2 // calc...
})));
// Position sprite
Object.assign(sprite.position, middlePos);
})
.onNodeClick(node => {
var baseUrl = "page/" + node.id;
window.location.href = baseUrl;
})
.onNodeHover(node => {
// ノードにホバーした時の処理
hoverNode = node ? node.id : null;
updateHoverText(); // テキストを更新する関数を呼...
})
.linkOpacity(0.25)
.linkDirectionalArrowLength(3)
.linkDirectionalArrowRelPos(1)
.linkCurvature(0.01)
.linkDirectionalParticleWidth(2)
.linkDirectionalParticles("value")
.linkDirectionalParticleSpeed(d => d.value * 0.01)
.linkThreeObjectExtend(true)
.linkColor(link=>{
if (link.value > 0){
return 'red'
} else {
return 'blue'
}
})
.linkWidth(1)
.backgroundColor("#f8f8f8");
function updateHoverText() {
// ホバー時のノードのテキストサイズを変更
Graph.nodeThreeObject(node => {
const sprite = new SpriteText(node.id);
sprite.material.depthWrite = false;
sprite.color = node.color;
sprite.textHeight = hoverNode === node.id ? 15 : ...
return sprite;
});
}
これを実行する際は改善前と同じくflaskフォルダ内のapp.pyを...
以下に実行結果を示す.
#ref(2.png)
終了行:
[[技術資料]]
大規模言語モデルに組み込む動的適応プルーニングの提案手法
*目次 [#e890b3d5]
#CONTENTS
*目的 [#x38aa8d3]
莫大なパラメータを保持するLLMは、推論時間や消費電力に課題...
理由として、不必要なパラメータも計算リソースとして含まれ...
そのため、本研究の目的はそのような不必要なパラメータを削...
*使うモジュールのインストール [#u1248302]
***使用するモジュール [#ta19c6d2]
|モジュール|version|用途|
|torch||PyTorchはLlama2のような大規模言語モデルのトレーニ...
|transformers||モデルの読み込み、トレーニング、評価|
|datasets||データセットのロードと前処理|
|accelerate||分散学習や混合精度トレーニング|
|bitsandbytes||量子化トレーニングや8ビット最適化に利用.|
|scipy||統計的な操作や最適化に利用|
|optimum|| Hugging Faceのエコシステムで、モデルの最適化(...
モジュールのインストールはコマンドプロンプトでpip install...
バージョンまで指定する場合はコマンドプロンプトでpip insta...
でインストールする
*事前学習モデル、データセットのダウンロード [#ob3ca958]
**huggingfaceとは [#v2c613db]
スクレイピングを用いてデータを収集する.
スクレイピングには「selenium」を用いる.
seleniumのバージョンについては上で示した通りである.
seleniumではクリックなどのユーザーアクションを模倣するこ...
スクレイピングをする部分のコードはこれ↓
#ref(scraping.py,,スクレイピング用コード)
#ref(スクレイピング流れ.PNG.jpg)
今回は日本銀行時系列統計データ検索サイトを例に説明する.
日本銀行時系列統計データ検索サイトではクリックアクション...
ダウンロードしたデータはcsv形式でダウンロードされる.
そのため,ダウンロードされたcsvファイルを一つのフォルダに...
また,ダウンロードした時点のファイル名もダウンロードされ...
そのためにまず,ファイルのダウンロード先を指定する必要が...
dldir_path = Path('保存先のフォルダのパス')
dldir_path.mkdir(exist_ok=True)
download_dir = str(dldir_path.resolve())
options.add_experimental_option('prefs', {'download.defa...
また,ファイル名を変更するコードとして以下を追加する.
filename_list=["変更後のファイル名(1)","変更後のファイル...
list_of_files = glob.glob('保存先のフォルダのパス/*')
latest_file = max(list_of_files, key=os.path.getctime)
file_name = str(latest_file.split('\\')[1])
print(latest_file)
print()
os.remove("csv/"+filename_list[i-1])
os.rename(latest_file,"csv/"+filename_list[i-1])
**APIを用いたモデルのダウンロード [#xbcf3848]
・API作成
hugging face(URL:https://huggingface.co/)のwebページ...
・API作成後モデルのダウンロード
実行環境にて下記のコマンドを入力にて
huggingface-cli login
右クリックで貼り付け
分析するためにはデータの前処理を行わなければ正しい結果は...
今回は前処理の手法として正規化を行う.
正規化の手法として,VAR-LiNGAMではMin-Max法によるデータの...
*VAR-LiNGAMへの適用 [#eb3cce83]
VAR-LiNGAMの分析ではPythonのモジュール「LiNGAM」のVAR-LiN...
これはhttps://lingam.readthedocs.io/en/latest/tutorial/va...
path = "用いるデータのパス"
df=pd.read_csv(path,parse_dates=True,index_col="Day",enc...
scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(df), c...
model = lingam.VARLiNGAM(lags=2, prune=True)
model.fit(normalized_df)
上のコードではデータの読み取り,正規化を行い,それについ...
labels = [f'{col}(t)' for i, col in enumerate(normalized...
make_dot(np.hstack(model.adjacency_matrices_),
lower_limit=0.05,
ignore_shape=True,
labels=labels
)
上のコードで2次元グラフを作成している.このコードは結果を...
graphvizのインストールについては以下のサイトを参考にした
https://www.kkaneko.jp/tools/win/graphviz.html
model = lingam.VARLiNGAM()
result = model.bootstrap(normalized_df,n_sampling=100)
これでLiNGAMのVAR-LiNGAMをモデルとして設定し,ブートスト...
ブートストラップ法では一般的に用いるデータのサンプル数よ...
p_values = model.get_error_independence_p_values()
これで誤差変数間の独立性を分析する.
cdc = result.get_causal_direction_counts(n_directions=8,...
split_by_causal_effect_sign=True)
このコードで因果関係の方向性を取得する.n_directionは上位...
print_causal_directions(cdc, 100, labels=labels)
でその結果を描画できる.
dagc = result.get_directed_acyclic_graph_counts(n_dags=3,
min_causal_effect=0.2, split_by_causal_effect_sign=True)
これではDAGのランキングを取得できる.また,
causal_effects = result.get_total_causal_effects(min_cau...
df = pd.DataFrame(causal_effects)
df['from'] = df['from'].apply(lambda x : labels[x])
df['to'] = df['to'].apply(lambda x : labels[x])
df
これで合計因果関係を取得することができ,この結果を用いて3...
#ref(ingakekka.PNG)
得られた因果性は上のような形式で保存される.
fromには影響を与えている要素,toには影響を与えられている...
一行ずつ因果の向きと大きさが格納されている
*数法則発見法(RF5法)によるモデル化 [#tdd1a952]
数法則発見法の1つであるRF5を用いて経済変数間のモデル化を...
RF5のプログラムは以下に貼っておく.
RF5では何度も反復を行い学習することでモデルを作成するため...
反復回数を設定する際にはwhile s < 500:の500の部分を反復し...
この反復回数は従来研究では10000回や20000回が望ましいと述...
実行して得られたBICが低ければ低いほど良い結果をとりやすい...
RFを実行する際はDriveのRF_real_experiment100.pyを実行すれ...
実行する際は実際に用いるデータを置き換える必要がある.
その際には169行目のpd.read_csv('データのパス(csv形式)')に...
データの形式の例を以下に示す.
#ref(data.png.jpg)
データの内容としては右端の列に目的変数,それ以外の列に説...
結果はtheta.csvに出力され,それをRF5の定式化に当てはめる...
以下にtheta.csvの中身を示す.
#ref(theta.jpg)
RF5の定式化は以下に示す.
#ref(RF_teishikika.png)
θは(w_0,w_j,w_jk)かなっている.
このθの中身がtheta.csvには格納され,これを用いて復元を行...
*因果3Dグラフの作成 [#s53cb794]
VAR-LiNGAMによって得られた結果から因果3Dグラフを作成する.
ここではVARLiNGAMで得られた合計因果関係を格納したcsvファ...
csvファイルは以下の形式で保存されており,以下のプログラム...
import pandas as pd
import json
from pyvis.network import Network
def kyoki_word_network():
got_net = Network(height="1000px", width="95%", bgcol...
got_data = pd.read_csv("ultra_kekka.csv")[:2000]
sources = got_data['from']
targets = got_data['to']
weights = got_data['effect']
unique_nodes = set(sources) | set(targets)
nodes = [{"id": node, "label": node, "title": node} f...
edges = [{"from": src, "to": dst, "color": 'red' if w...
nodes_json = json.dumps(nodes, ensure_ascii=False)
edges_json = json.dumps(edges, ensure_ascii=False)
html_code = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=ed...
<meta name="viewport" content="width=device-width...
<title>Your Network</title>
<style>
#mynetwork {
height: 1000px;
width: 95%;
border: 1px solid lightgray;
}
</style>
</head>
<body>
<div id="mynetwork"></div>
<script type="text/javascript" src="https://unpkg...
<script>
var container = document.getElementById("myne...
var nodes = new vis.DataSet(""" + nodes_json ...
var edges = new vis.DataSet(""" + edges_json ...
var data = {nodes: nodes, edges: edges};
var options = {};
var network = new vis.Network(container, data...
// ノードのダブルクリック用のイベントリスナー...
network.on("doubleClick", function (params) {
if (params.nodes.length > 0) {
var nodeId = params.nodes[0];
var nodeLabel = nodes.get(nodeId).lab...
// ページ遷移や他のダブルクリックされ...
window.location.href = "page/" + node...
}
});
</script>
</body>
</html>
"""
with open("your_network.html", "w", encoding="utf-8")...
html_file.write(html_code)
got_net.show_buttons(filter_=['physics'])
return got_net
kyoki_word_network()
jscode=""の部分でクリックアクションなどを設定している.
今回はダブルクリックしたときにページ遷移するようにした.
#ref(networka.PNG)
ここからノードをクリックすることで,ページ遷移を行う.
**3Dグラフによる可視化 [#u182dd73]
改善版としてグラフをよりアトラクティブにするシステムを作...
改善前ではノードを引っ張ることしかできていなかったが,ク...
その際にはthree.jsによる可視化を行い,アプリケーションの...
three.jsについては以下のサイトを参考にした.
https://github.com/vasturiano/3d-force-graph
以下に改善版のプログラムを示す.
const highlightLinks = new Set();
const highlightNodes = new Set();
let hoverNode = null;
const Graph = ForceGraph3D()
(document.getElementById("three"))
.jsonUrl('http://127.0.0.1:5000/static/output2.json')
.nodeColor('#ffffff')
.nodeLabel('id')
.nodeRelSize(20)
.nodeThreeObject(node => {
const sprite = new SpriteText(node.id);
sprite.material.depthWrite = false; // make sprit...
sprite.color = node.color;
sprite.textHeight = 7.5;
return sprite;
})
.linkThreeObject(link => {
// extend link with text sprite
const sprite = new SpriteText(`${link.value}`);
sprite.color = 'blue';
sprite.textHeight = 1.5;
return sprite;
})
.linkPositionUpdate((sprite, { start, end }) => {
const middlePos = Object.assign(...['x', 'y', 'z'...
[c]: start[c] + (end[c] - start[c]) / 2 // calc...
})));
// Position sprite
Object.assign(sprite.position, middlePos);
})
.onNodeClick(node => {
var baseUrl = "page/" + node.id;
window.location.href = baseUrl;
})
.onNodeHover(node => {
// ノードにホバーした時の処理
hoverNode = node ? node.id : null;
updateHoverText(); // テキストを更新する関数を呼...
})
.linkOpacity(0.25)
.linkDirectionalArrowLength(3)
.linkDirectionalArrowRelPos(1)
.linkCurvature(0.01)
.linkDirectionalParticleWidth(2)
.linkDirectionalParticles("value")
.linkDirectionalParticleSpeed(d => d.value * 0.01)
.linkThreeObjectExtend(true)
.linkColor(link=>{
if (link.value > 0){
return 'red'
} else {
return 'blue'
}
})
.linkWidth(1)
.backgroundColor("#f8f8f8");
function updateHoverText() {
// ホバー時のノードのテキストサイズを変更
Graph.nodeThreeObject(node => {
const sprite = new SpriteText(node.id);
sprite.material.depthWrite = false;
sprite.color = node.color;
sprite.textHeight = hoverNode === node.id ? 15 : ...
return sprite;
});
}
これを実行する際は改善前と同じくflaskフォルダ内のapp.pyを...
以下に実行結果を示す.
#ref(2.png)
ページ名: