ryann 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ryann/__init__.py +126 -0
- ryann-0.0.1.dist-info/METADATA +22 -0
- ryann-0.0.1.dist-info/RECORD +5 -0
- ryann-0.0.1.dist-info/WHEEL +5 -0
- ryann-0.0.1.dist-info/top_level.txt +1 -0
ryann/__init__.py
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
import torch.nn as nn
|
|
3
|
+
|
|
4
|
+
def ParaLSTM(system_dim, embed_dim, num_heads, nclass, vocab_size):
|
|
5
|
+
mini_info = '''
|
|
6
|
+
Памятка использования ParaLSTM в рамках библиоткени ryaNN.
|
|
7
|
+
|
|
8
|
+
<pars:ParaLSTM-main>
|
|
9
|
+
Что такое ParaLSTM?
|
|
10
|
+
ParaLSTM - вид архитектуры нейронной сети, представляющая собой параллельную LSTM с модификациями. Данная архитектура имеет 2 вентиля - Input и forget.
|
|
11
|
+
Если в обычной LSTM сначала идет Forget, то у ParaLSTM сначала input. Это связанно с отстутсвием рекуррентности архитектуры. Записывать в память просто x - будет нелогично. Это создаст проблемы с классификацией в будущем.
|
|
12
|
+
Все идет параллельно - сначала обновляем x на основе голов и складываем, получая мнение всех голов вместе взятых. Потом делим на количество голов для нормализации и прогоняем через Tanh для получения сигналов что сеть считает важным (любит ли сообщество голов такой отрывок из embeddingа x или нет), а что нет (насколько не любит сообщество голов данный отрывок из embeddingа x).
|
|
13
|
+
<pars:ParaLSTM-main>
|
|
14
|
+
|
|
15
|
+
<pars:ParaLSTM-ingate>
|
|
16
|
+
InGate в ParaLSTM это просто матричное умножение каждой из голов (x@h), независимо от других голов. Каждая "любит" свои сигналы (непример, при классификации текста мат/не мат) каждая матрица весов подстраивается под embedding - напримеро, в эмбеддинге токена "ху" есть важные сигналым на позициях 20 и 50, которые есть только у токена "ху". Нарпимер, голова 1 будет смотреть на эти сигналы (20, 50) больше всего и конечно будет смотреть на другие, но основа будет 20 и 50е позиции, а вторая меньше всего на 20 и 50 позиции (если во время обучения веса сложились так, что эта голова не любит смотреть на плохие слова и всегда ищет только хорошее). Как мы видим, первая голова хочет распознать мат, а вторая - хорошее слово.
|
|
17
|
+
Так же важно знать: этот гейт складывает в один тензор все, что выдали головы. Только потом нормализует (делит на количество голов) и пропускает через tanh. Этот гейт может быть не стабильным по сравнению с оригинальным Input Gate в LSTM.
|
|
18
|
+
Работа:
|
|
19
|
+
headox = torch.zeros(x.size(0), x.size(1), self.system_dim)
|
|
20
|
+
k_del = 0
|
|
21
|
+
for i in self.body:
|
|
22
|
+
headx = x @ i
|
|
23
|
+
headox = headox + headx
|
|
24
|
+
k_del = k_del+ 1
|
|
25
|
+
headox = headox / k_del
|
|
26
|
+
headox = self.tanh(headox)
|
|
27
|
+
memory = memory + headox
|
|
28
|
+
|
|
29
|
+
Сначала memory - это тензор с нулями, размера batch, x.size(1), system_dim
|
|
30
|
+
<pars:ParaLSTM-ingate>
|
|
31
|
+
|
|
32
|
+
<pars:ParaLSTM-fogate>
|
|
33
|
+
ForgetGate в ParaLSTM копирует 1в1 формулы и работу InGate, только со своими весами и головами. Головы в ForgetGate, в отличие от InGate решают, что будет не важно на основе входа x. Далее так же нормализуем, но уже не tanh, а сигмоид (sigmoid). Это сделано для того, что бы умножить память на наш новый тензор (прямо как в LSTM с f_t и c_t) операцией memory * f_paralstm. Memory на этот момент содержит инофрмацию, которую заготовил InGate.
|
|
34
|
+
Получается, у нас есть 2 вентиля которые работают в паре и готовят память.
|
|
35
|
+
Работа:
|
|
36
|
+
headoxn = torch.zeros(x.size(0), x.size(1), self.system_dim)
|
|
37
|
+
k_del = 0
|
|
38
|
+
for i in self.forgets_x:
|
|
39
|
+
headoxn = headoxn + (x @ i)
|
|
40
|
+
k_del = k_del + 1
|
|
41
|
+
head_add = headoxn/k_del
|
|
42
|
+
head_add = self.sigmoid(head_add)
|
|
43
|
+
memory = memory * head_add
|
|
44
|
+
<pars:ParaLSTM-fogate>
|
|
45
|
+
|
|
46
|
+
<pars:ParaLSTM-memory>
|
|
47
|
+
После всех вентилей мы должны сформировать матрицу размером batch, system_dim. Это будет общая информация о всей последовательности. Сначала, мы усредняем нашу память (memory.mean(dim=1)), затем матрично умножаем на веса памяти. Все то же самое, что и в других вентилях, но с чуть другими размерностями. И прогоняем через tanh для стабильности.
|
|
48
|
+
Теперь тут сигналы - насколько этот нейрон, а точнее веса нейрона любят это число в памяти. Потом, мы так же нормализуем память и прогоняем через линейный слой. В основном, задача слоев LSTM, RNN, MHA и т.п. - преобразовать матрицу последовательности для классификации линейным слоем. Зачем так делать, встает вопрос. Это делается для того, что бы линейный слой запомнил стиль выхода слоя и не получал всегда разные, хаотичные входы. Это поможет его весам стабильностью.
|
|
49
|
+
Работа:
|
|
50
|
+
memory = memory.mean(dim=1)
|
|
51
|
+
memn = torch.randn(memory.size(0), self.system_dim)
|
|
52
|
+
k_del = 0
|
|
53
|
+
for i in self.matrix:
|
|
54
|
+
memn = memn + (memory@i)
|
|
55
|
+
k_del = k_del + 1
|
|
56
|
+
memn = memn / k_del
|
|
57
|
+
memn = self.tanh(memn)
|
|
58
|
+
memory = memn
|
|
59
|
+
<pars:ParaLSTM-memory>
|
|
60
|
+
|
|
61
|
+
<pars:parsing>
|
|
62
|
+
Info - <pars:ParaLSTM-main>
|
|
63
|
+
InGate - <pars:ParaLSTM-ingate>
|
|
64
|
+
ForgetGate - <pars:ParaLSTM-fogate>
|
|
65
|
+
Memory - <pars:ParaLSTM-memory>
|
|
66
|
+
<pars:parsing>
|
|
67
|
+
'''
|
|
68
|
+
class AI(nn.Module):
|
|
69
|
+
def __init__(self, vocab_size=vocab_size, nclass=nclass, embed_dim=embed_dim, num_heads=num_heads, system_dim=system_dim):
|
|
70
|
+
super().__init__()
|
|
71
|
+
self.embedding = nn.Embedding(vocab_size, embed_dim)
|
|
72
|
+
self.system_dim = system_dim
|
|
73
|
+
self.body = nn.ParameterList([
|
|
74
|
+
|
|
75
|
+
])
|
|
76
|
+
for i in range(num_heads):
|
|
77
|
+
self.body.append(nn.Parameter(torch.randn(embed_dim, system_dim)))
|
|
78
|
+
|
|
79
|
+
self.forgets_x = nn.ParameterList([
|
|
80
|
+
|
|
81
|
+
])
|
|
82
|
+
for i in range(num_heads):
|
|
83
|
+
self.forgets_x.append(nn.Parameter(torch.randn(embed_dim, system_dim)))
|
|
84
|
+
self.matrix = nn.ParameterList([
|
|
85
|
+
|
|
86
|
+
])
|
|
87
|
+
for i in range(num_heads):
|
|
88
|
+
self.matrix.append(nn.Parameter(torch.randn(system_dim, system_dim)))
|
|
89
|
+
self.tanh = nn.Tanh()
|
|
90
|
+
self.sigmoid = nn.Sigmoid()
|
|
91
|
+
self.normalization = nn.LayerNorm(system_dim)
|
|
92
|
+
self.linear = nn.Linear(system_dim, nclass)
|
|
93
|
+
def forward(self, x):
|
|
94
|
+
x = self.embedding(x)
|
|
95
|
+
memory = torch.zeros(x.size(0), x.size(1), self.system_dim)
|
|
96
|
+
if x.dim() == 2:
|
|
97
|
+
x = x.unsqueeze(0)
|
|
98
|
+
headox = torch.zeros(x.size(0), x.size(1), self.system_dim)
|
|
99
|
+
k_del = 0
|
|
100
|
+
for i in self.body:
|
|
101
|
+
headx = x @ i
|
|
102
|
+
headox = headox + headx
|
|
103
|
+
k_del = k_del+ 1
|
|
104
|
+
headox = headox / k_del
|
|
105
|
+
headox = self.tanh(headox)
|
|
106
|
+
memory = memory + headox
|
|
107
|
+
headoxn = torch.zeros(x.size(0), x.size(1), self.system_dim)
|
|
108
|
+
k_del = 0
|
|
109
|
+
for i in self.forgets_x:
|
|
110
|
+
headoxn = headoxn + (x @ i)
|
|
111
|
+
k_del = k_del + 1
|
|
112
|
+
head_add = headoxn/k_del
|
|
113
|
+
head_add = self.sigmoid(head_add)
|
|
114
|
+
memory = memory * head_add
|
|
115
|
+
memory = memory.mean(dim=1)
|
|
116
|
+
memn = torch.randn(memory.size(0), self.system_dim)
|
|
117
|
+
k_del = 0
|
|
118
|
+
for i in self.matrix:
|
|
119
|
+
memn = memn + (memory@i)
|
|
120
|
+
k_del = k_del + 1
|
|
121
|
+
memn = memn / k_del
|
|
122
|
+
memn = self.tanh(memn)
|
|
123
|
+
memory = memn
|
|
124
|
+
x = self.linear(memory)
|
|
125
|
+
return x
|
|
126
|
+
return (AI(), mini_info)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ryann
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: ryaNNA library created for training our own architectures. Fully compatible with PyTorch. IMPORTANT - the Russian translation may be off and written with issues.
|
|
5
|
+
Home-page: https://huggingface.co/BIGAI-models
|
|
6
|
+
Author: Radmir Ryan
|
|
7
|
+
Author-email: radmirryan@icloud.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Requires-Dist: torch>=1.9.0
|
|
15
|
+
Dynamic: author
|
|
16
|
+
Dynamic: author-email
|
|
17
|
+
Dynamic: classifier
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-dist
|
|
21
|
+
Dynamic: requires-python
|
|
22
|
+
Dynamic: summary
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
ryann/__init__.py,sha256=Q0WR0js45Q9ssIsMl1sPPRnhJM5ZSeWrZXSSD1vJLro,9118
|
|
2
|
+
ryann-0.0.1.dist-info/METADATA,sha256=xEI56VAv-BS6dxktyuQ3wyRbc_XCLW8GbHQX-lwM-ZQ,829
|
|
3
|
+
ryann-0.0.1.dist-info/WHEEL,sha256=YLJXdYXQ2FQ0Uqn2J-6iEIC-3iOey8lH3xCtvFLkd8Q,91
|
|
4
|
+
ryann-0.0.1.dist-info/top_level.txt,sha256=Sby-KOaZiDEDtvWXQZiYUyeofYovlfUxH-a_m6TE3_Y,6
|
|
5
|
+
ryann-0.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ryann
|