turns-00018.parquet:2929
dbf8cbb1ae5b5628b50e2054
turn 9/9gpt-3.5-turbo-0125EnglishRussia348 words
degenerate_repetitionAbsentFinal dense release
USER
class QR_ReductionQ(nn.Module):
''' Нашел! QR слой с норм seq Len и высоким качеством '''
def __init__(self, n_components):
super().__init__()
self.n_components = n_components
def forward(self, hidden_states):
# Perform QR decomposition on the transposed input to get Q, R where Q has orthogonal columns
Q, R = torch.linalg.qr(hidden_states.T)
# Take the first 'n_components' columns of Q and transpose it back
Q_reduced = Q[:, :self.n_components].T
# Multiply the original hidden_states with the reduced Q to get the reduced hidden states
out = torch.matmul(hidden_states, Q_reduced.T)
return out
Сделать слой обучаемым,
то есть чтобы по мере датасета изменялся а не сразу от одного входящего X (hidden_states), а постеменно через обновление весов с fit
примерно с этим: torch.nn.Parameter(initial_weights)
чтобы обновлялся с
loss.backward()
optimizer.step()
новый код класса, torch:ASSISTANT
Для того чтобы сделать слой обучаемым и обновлять его по мере тренировки модели, необходимо сделать веса слоя trainable параметрами. Для этого в PyTorch используются классы `torch.nn.Parameter` и метод `register_parameter`. Вот исправленный код с учетом этого:
```python
import torch
import torch.nn as nn
class QR_ReductionQ(nn.Module):
''' Нашел! QR слой с норм seq Len и высоким качеством '''
def __init__(self, n_components, input_size):
super(QR_ReductionQ, self).__init__()
self.n_components = n_components
self.input_size = input_size
# Инициализация параметров слоя как обучаемых параметров
self.Q_reduced = nn.Parameter(torch.randn(n_components, input_size))
def forward(self, hidden_states):
# Perform QR decomposition on the transposed input to get Q, R where Q has orthogonal columns
Q, R = torch.linalg.qr(hidden_states.T)
# Take the first 'n_components' columns of Q and transpose it back
Q_reduced = Q[:, :self.n_components].T
# Multiply the original hidden_states with the reduced Q to get the reduced hidden states
out = torch.matmul(hidden_states, self.Q_reduced.T)
return out
# Пример применения с обучаемым слоем
size_changing = 1000
input_size = 4096
output_size = 700
input_hidden_states = torch.randn(size_changing, input_size)
qr_reducer = QR_ReductionQ(output_size, input_size)
optimizer = torch.optim.SGD(qr_reducer.parameters(), lr=0.01)
# Пример обновления слоя через потери и оптимизатор
loss_func = nn.MSELoss()
outputs = qr_reducer(input_hidden_states)
loss = loss_func(outputs, torch.randn(size_changing, output_size))
loss.backward()
optimizer.step()
print(outputs.size())
```
В этом коде веса слоя `Q_reduced` инициализируются как обучаемые параметры с помощью `nn.Parameter`. Затем создается экземпляр класса `QR_ReductionQ` с передачей размеров входа и выхода, оптимизатор подключается к параметрам слоя, и показан пример обновления слоя через потери и оптимизатор.