구릅 코랩과 챗지피티가 아니었다면, 머신러닝을 지나 딥러닝/NLP까지 도착하지는 못했을 것이다. 늘 고맙게 감사하게 생각한다.

 

torch.nn.Embedding에서 _weight 옵션은 임베딩 행렬의 초기값을 설정하는 데 사용됩니다. 이 매개변수는 주로 Embedding.from_pretrained() 메서드 내부에서 사용되며, 사용자가 직접 임베딩 행렬을 지정할 수 있습니다.


기본 동작

nn.Embedding을 생성할 때 _weight를 명시적으로 설정하면, 해당 값을 임베딩 행렬로 사용합니다. 이를 통해 사전 학습된 임베딩(예: GloVe, FastText)을 모델 초기화에 활용할 수 있습니다.


_weight 매개변수

  • 타입: torch.Tensor
  • 크기: (num_embeddings, embedding_dim)
    • num_embeddings: 사전에 포함된 고유 토큰 수.
    • embedding_dim: 각 토큰의 임베딩 벡터 차원.
  • 역할: 초기 임베딩 행렬로 사용되며, 학습 가능 여부는 모델 설정에 따라 달라집니다.
  • 주의: _weight는 Embedding 객체를 초기화할 때만 사용할 수 있으며, 이후에는 접근하거나 수정할 수 없습니다.

사용 예제

1. _weight를 수동으로 설정

import torch
import torch.nn as nn

# 사용자 지정 임베딩 행렬 (사전 학습된 값 예시)
pretrained_weights = torch.tensor([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])

# nn.Embedding 초기화 시 _weight 설정
embedding = nn.Embedding(num_embeddings=3, embedding_dim=2, _weight=pretrained_weights)

# 입력 데이터
input_indices = torch.tensor([0, 2])
output = embedding(input_indices)

print(output)
# 출력: [[0.1, 0.2], [0.5, 0.6]]

2. from_pretrained()와 비교

Embedding.from_pretrained()는 _weight를 설정하는 더 편리한 방법입니다.

# 동일한 pretrained_weights 사용
embedding = nn.Embedding.from_pretrained(pretrained_weights)

# 입력 데이터
input_indices = torch.tensor([0, 2])
output = embedding(input_indices)

print(output)
# 출력: [[0.1, 0.2], [0.5, 0.6]]

사전 학습된 임베딩 사용

_weight를 활용하면 사전 학습된 임베딩을 쉽게 사용할 수 있습니다. 예를 들어, GloVe나 FastText 임베딩을 가져와 torch.Tensor로 변환한 뒤 _weight에 전달하면 됩니다.

import numpy as np

# 사전 학습된 GloVe 임베딩 (numpy 배열)
pretrained_glove = np.array([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]])

# torch.Tensor로 변환
pretrained_weights = torch.tensor(pretrained_glove)

# _weight로 초기화
embedding = nn.Embedding(num_embeddings=3, embedding_dim=2, _weight=pretrained_weights)

# 입력 데이터
input_indices = torch.tensor([1])
output = embedding(input_indices)

print(output)
# 출력: [[0.3, 0.4]]

_weight의 학습 가능 여부

  • _weight로 설정된 임베딩 행렬은 기본적으로 학습 가능합니다.
  • 학습을 방지하려면 from_pretrained()의 freeze=True를 사용하거나, 수동으로 파라미터를 고정해야 합니다:
    embedding = nn.Embedding.from_pretrained(pretrained_weights, freeze=True)
    

요약

  • _weight는 초기 임베딩 행렬을 지정하는 데 사용됩니다.
  • 주로 사전 학습된 임베딩을 사용할 때 활용됩니다.
  • 학습 가능 여부를 설정하려면 추가적인 설정이 필요합니다.

더 자세한 사항이나 추가적인 질문이 있다면 알려주세요! 😊

반응형

'Python, PySpark' 카테고리의 다른 글

RNN in python with Keras, PyTorch  (0) 2025.01.20
NewsClassifier  (0) 2025.01.04
Python Scheduler  (0) 2024.12.10
networkx - sql과 함께  (0) 2024.10.24
Python networkx  (1) 2024.10.10
class NewsClassifier(nn.Module):
def __init__(self, embedding_size, num_embeddings, num_channels,
hidden_dim, num_classes, dropout_p,
pretrained_embeddings = None, padding_idx = 0):
"""
매개변수:
embedding_size (int): 임베딩 벡터의 크기
num_embeddings (int): 임베딩 벡터의 개수
num_channels (int): 합성곱 커널 개수
hidden_dim (int): 은닉 차원 크기
num_classes (int): 클래스 개수
dropout_p (float): 드롭아웃 확률
pretrained_embeddings (numpy.array): 사전 훈련된 단어 임베딩
기본값은 None
padding_idx (int): 패딩 인덱스
"""
super(NewsClassifier, self).__init__()

if pretrained_embeddings is None:
self.emb = nn.Embedding(embedding_dim = embedding_size,
num_embeddings = num_embeddings,
padding_idx = padding_idx )
else:
pretrained_embeddings = torch.from_numpy(pretrained_embeddings).float()
self.emb = nn.Embedding(embedding_dim = embedding_size,
num_embeddings = num_embeddings,
padding_idx = padding_idx,
_weight = pretrained_embeddings)

self.convnet = nn.Sequential(
nn.Conv1d(in_channels = embedding_size,
out_channels = num_channels, kernel_size = 3),
nn.ELU(),
nn.Conv1d(in_channels = num_channels, out_channels = num_channels,
kernel_size = 3, stride = 2),
nn.ELU(),
nn.Conv1d(in_channels = num_channels, out_channels = num_channels,
kernel_size = 3, stride = 2),
nn.ELU(),
nn.Conv1d(in_channels = num_channels, out_channels = num_channels,
kernel_size = 3),
nn.ELU()
)

self._dropout_p = dropout_p
self.fc1 = nn.Linear(num_channels, hidden_dim)
self.fc2 = nn.Linear(hidden_dim, num_classes)

def forward(self, x_in, apply_softmax = False):
""" 분류기의 정방향 계산

매개변수:
x_in (torch.Tensor): 입력 데이터 텐서
x_in.shape는 (batch, dataset._max_seq_length)입니다.
apply_softmax (bool): 소프트맥스 활성화 함수를 위한 플래그
크로스-엔트로피 손실을 사용하려면 False로 지정합니다.
반환값:
결과 텐서. tensor.shape은 (batch, num_classes)입니다.
"""

# 임베딩을 적용하고 특성과 채널 차원을 바꿉니다.
x_embedded = self.emb(x_in).permute(0, 2, 1)

features = self.convnet(x_embedded)

# 평균 값을 계산하여 부차적인 차원을 제거합니다.
remaining_size = features.size(dim = 2)
#print(f"remaining_size: {remaining_size}")
features = F.avg_pool1d(features, remaining_size).squeeze(dim = 2)
features = F.dropout(features, p = self._dropout_p)

# MLP 분류기
intermediate_vector = F.relu(F.dropout(self.fc1(features), p = self._dropout_p))
prediction_vector = self.fc2(intermediate_vector)

if apply_softmax:
prediction_vector = F.softmax(prediction_vector, dim = 1)

return prediction_vector

주어진 `NewsClassifier` 모델은 PyTorch를 기반으로 한 뉴스 분류를 위한 신경망입니다. 주요 구조와 작동 방식을 아래에 정리했습니다.

---

### **주요 특징**

1. **임베딩 레이어**:
   - `pretrained_embeddings`(사전 학습된 임베딩)이 제공되면 이를 사용하여 임베딩 레이어를 초기화합니다. 
   - 제공되지 않으면 새로 임베딩 레이어를 생성합니다.
   - `padding_idx`는 패딩 토큰이 학습에 영향을 주지 않도록 설정합니다.

2. **합성곱 신경망(CNN)**:
   - 여러 개의 `Conv1d` 레이어로 구성된 합성곱 구조를 통해 입력 데이터를 처리합니다.
   - 각 합성곱 레이어 뒤에 `ELU` 활성화 함수가 적용됩니다.
   - `stride`와 `kernel_size` 설정으로 시퀀스 길이를 점진적으로 줄입니다.

3. **글로벌 평균 풀링**:
   - `avg_pool1d`를 사용하여 시퀀스 차원을 고정된 크기로 줄입니다.
   - 이를 통해 합성곱 레이어에서 추출된 특징을 요약합니다.

4. **완전 연결 레이어 (MLP)**:
   - 두 개의 선형 레이어(`fc1`, `fc2`)가 최종 분류기를 형성합니다.
   - 드롭아웃 레이어를 사용하여 과적합을 방지합니다.

5. **소프트맥스 활성화 함수 (선택적)**:
   - `apply_softmax` 플래그를 통해 소프트맥스를 출력에 적용할지 선택할 수 있습니다.
   - 이는 확률 분포를 해석하거나 추론 시 유용합니다.

---

### **정방향 계산 과정**

1. **임베딩**:
   - 입력 토큰을 임베딩 레이어를 통해 밀집 벡터(dense vector)로 변환합니다.
   - Conv1d 레이어에 적합하도록 시퀀스 축과 채널 축을 교환합니다.

2. **합성곱 및 풀링**:
   - 합성곱 레이어를 통해 특징을 추출하고 시퀀스 길이를 줄입니다.
   - `avg_pool1d`로 시퀀스 차원을 완전히 제거해 고정 크기 벡터를 만듭니다.

3. **분류**:
   - 완전 연결 네트워크를 통해 분류 작업을 수행합니다.
   - 드롭아웃을 적용하여 과적합을 방지합니다.
   - 최종 출력은 `(배치 크기, 클래스 개수)`의 텐서입니다.

4. **소프트맥스**:
   - `apply_softmax=True`일 경우, 출력 텐서를 확률 분포로 변환합니다.

---

### **개선 가능성**

1. **합성곱에서 패딩 사용**:
   - `padding="same"`을 적용하여 시퀀스 양 끝의 정보 손실을 방지할 수 있습니다.

2. **배치 정규화 (Batch Normalization)**:
   - 합성곱 레이어 뒤에 배치 정규화를 추가하면 학습 안정성과 수렴 속도가 개선됩니다.

3. **파라미터 초기화**:
   - Xavier 또는 Kaiming 초기화를 사용하면 모델 성능이 더 좋아질 수 있습니다.

4. **문서화**:
   - 중간 텐서들의 예상 크기를 주석으로 추가하면 가독성이 높아집니다.

5. **에러 핸들링**:
   - 입력 텐서의 차원을 검증하여 데이터 형태가 맞지 않을 경우 바로 에러를 출력하도록 설정합니다.

---

### **도움이 필요한 점이 있나요?**
위 모델을 개선하거나 학습에 사용할 코드를 추가적으로 작성해드릴까요? 😊

반응형

'Python, PySpark' 카테고리의 다른 글

RNN in python with Keras, PyTorch  (0) 2025.01.20
torch.nn.Embedding()  (0) 2025.01.04
Python Scheduler  (0) 2024.12.10
networkx - sql과 함께  (0) 2024.10.24
Python networkx  (1) 2024.10.10

동부그룹이 오랫동안 투자하고 이제서야 먹고 살만한 파운드리 업체 디비하이텍에 투자해볼까 하고 들어가보니, 대주주 과다 급여 지불로 말이 많구만. 그래도 대주주가 뚝심있게 투자를 했고 이제 어느 정도 성과가 나오겠구나 생각이 들어서 들어가 보니, 국장 투자 하면 안되는 첫번째 요건, 대주주 전횡인 회사이다. 그래도 제대로 정신이 박힌 회사인줄 알았더니 그런 회사가 아니다.

국장에 투자하면 소액주주 돈을 뺏어간다고 하던데 딱 그 상황이로구나. 상법 개정하기 전에는 국장은 쳐다도 보지 말아야 한다는 말에 동감하게 된다. 남들 다하는 미국 지수투자 하고 있지만 작년 연초에 싹 정리하고 나서 수익률이 그리 좋지 않다. 전기차 배터리/2차 전지에 물린게 꽤 있지만 미국 주시 투자는 준수한 수익률과 배당을 보야주고 있다.

새삼 국내 주식 투자는 안하는게 맞다는 생각을 다시 하고 있다. 투자를 하기 시작한지 이제 만 3년이 지났고 코로나 끝나고 마이너스 25% 시작해서 이제 플러스로 갈까 말까 하지만 국장은 아무리 봐도 아닌듯 하다. 괜찮은 ETF로 장기+적립식 투자하던 포트폴리오에서 벗어나는 국장은 아닌 것 같다.

미장은 손해를 보고 국장은 돈을 훔쳐간다는 격언을 다시 떠올리는 저녁 무렵이다.

반응형

'투자' 카테고리의 다른 글

내 자산 포트폴리오-1 [Kodex CD금리액티브(합성)]  (0) 2024.12.28

둘째 대학 들어가서 건축 헌금 하려고 했는데 셋째, 넷째 인강 + 교재 돈으로 오늘 100만원 사용.

반응형

 이전 회사 퇴직하면서 기존에 부어왔던 연금신탁을 증권회사 연금펀드로 이전했고, 이후 퇴직금을 IRP에 넣어서 투자라는 것을 시작하게 되었다. 새로운 회사에서는 다행히도 IRP 보조가 되어서, 새로운 곳에서도 IRP를 납입하게 되었다. 아이들 학원비 내는 틈틈이 ISA 계좌도 만들어서 투자를 시작했다. 회사 다니면서 그동안 피해왔던, 아니 생활비 버느라 못해왔던 투자를 하기 시작했다. 처음에는 투자를 알려주던 선배의 조언을 듣고 투자를 하다가, 대대적인 손실을 봤다. 그나마 다행인 것은 IRP의 경우 상당금액을 정기예금에 넣어놨고 2년 정도 지나자 마이너스가 플러스로 돌아섰다.

 

 분산 투자를 했을 때 그나마 어느 정도 성과가 나기 시작했고, 이후에는 투자에 대해서 어느 정도 고민을 하게 되었다. 같은 팀에 있던 형님이 딜러 출신이라서 점심을 먹으면서 투자에 대한 이야기를 많이 했고 차츰 주식이나 ETF에 대해서 배우게 되었다. 배우면서 조금씩 지수나 포트폴리오에 대해서 알게 되었고 소액 적립식 분산 투자를 시작했다. 수익이 난 이후 적극적으로 리밸런싱을 하면서 중국, 미국, 한국 그리고 금리액티브로 포트폴리오를 만들었다.

 

 핵심은 이러하다 괜찮은 ETF를 오랫동안 탐색하다가 투자를 시작하고 최소한 2년은 중간 매도하지 않고 꾸준히 수익률을 관찰한다. 이후에는 특별한 일이 없다면 계속해서 무지성 적립 투자를 하고 중간 매도하지 않는다. 이렇게 매도를 하지 않고 기다린다면, 그리고 내가 담은 ETF를 믿는다면 플러스 수익률이 나오게 된다. 지금까지 2년 가까이 해오면서 아직까지 마이너스인 펀드들도 있다. 전기차 배터리나, 인프라, 부동산 리츠, 2차 전지  펀드들은 -10% ~ -33%의 수익률을 자랑한다. 다른 펀드에서 플러스로 메꾸면서 어느 정도는 꾸준한 수익률을 맞출 수 있다. 아주 높은 수익률은 아니지만 정기예금보다는 더 괜찮은 수익률을 꾸준히 올릴 수 있었다.

 

 문제는 내가 포트폴리오가 너무 많아서(20개 정도) 기억을 잘 못한다는 것이다. 연초에 수익률이 높은 미국 펀드를 모두 팔아서 포트폴리오를 새로 개비했다. 중국 펀드를 3개, 인도 펀드 1개를 추가했고 TSLY, CONY 같은 생소한 외국 ETF도 가입해서 불입하기 시작했다. 투자를 오랫동안 해야 하기 때문에 학습비용도 있다고 판단해서 최대한 포트폴리오를 자잘하고 촘촘하게 만들어놨다.

 

 오늘은 모든 펀드의 우물같은 역할을 해주는 모펀드 개념이다. 리밸런싱 하면서 수익이 난 금액을 한번에 투자하지 않고 매월 쪼개서 다른 펀드에 넣는 역할을 한다. 펀드 계좌에서는 예금이 없고 MMF는 수익률이 너무 낮아서 여기에 투자하게 되었다. 당장 돈이 급한 것은 아니기 때문에 이 펀드 상품의 월배당 상품에는 가입하지 않고 있다. 어차피 매월 쪼개서 팔아서 다른 펀드로 이동하기 때문에 월배당이 필요하지 않은 이유이기도 하고.

 

**Kodex CD금리액티브(합성)**은 한국의 상장지수펀드(ETF)로, 주로 CD(양도성 예금증서) 금리를 추종하는 금융 상품입니다. 이 상품은 채권 및 금리 상품에 투자하는 투자자들에게 단기 금리 움직임에 노출될 수 있는 기회를 제공합니다. 아래는 이 상품에 대한 주요 특징과 개념입니다.


1. 주요 특징

  1. CD 금리 기반:
    • 이 ETF는 주로 91일물 CD 금리를 기반으로 설계되었습니다.
    • CD 금리는 한국의 단기 시장 금리 중 하나로, 시장의 유동성과 금리 흐름을 반영합니다.
  2. 액티브 전략:
    • 단순히 금리를 패시브하게 추종하는 것이 아니라, 액티브 운용 전략을 통해 금리 변화에 대응하고 초과 수익을 추구합니다.
  3. 합성 구조:
    • 이 ETF는 합성 ETF로, 실제 CD 금리에 직접 투자하지 않고 파생상품(스왑 계약 등)을 활용해 CD 금리를 추종합니다.
    • 이를 통해 효율적인 금리 노출을 제공합니다.
  4. 안정적인 수익률:
    • 단기 금리 변동에 따라 수익률이 움직이며, 금리 상승기에는 상대적으로 더 높은 수익을 기대할 수 있습니다.
  5. 비교적 낮은 리스크:
    • 단기 금리에 기반한 상품이므로 상대적으로 변동성이 낮고 안정적인 자산으로 분류됩니다.

2. 투자 목적

  • 현금 대안:
    • 단기 금리에 투자해 예금 금리보다 약간 높은 수익을 목표로 합니다.
  • 포트폴리오 다각화:
    • 주식이나 장기 채권과 다른 성격의 자산으로 포트폴리오 위험을 분산합니다.
  • 금리 상승 방어:
    • 금리가 상승할 때, CD 금리가 오르기 때문에 수익률도 증가합니다.

3. 적합한 투자자

  • 보수적인 투자자:
    • 원금 손실 가능성이 낮은 안정적인 상품을 선호하는 사람.
  • 단기 투자 목적:
    • 단기적으로 자금을 투자하고자 하는 사람.
  • 금리 환경을 활용하려는 투자자:
    • 금리 상승기에 단기 금리 상승 효과를 활용하려는 투자자.

4. 위험 요소

  1. 합성 구조 리스크:
    • 파생상품을 이용하기 때문에 신용 리스크(파생상품 발행사의 디폴트 리스크)가 있습니다.
  2. 금리 변동성:
    • 금리가 하락할 경우 기대 수익률이 낮아질 수 있습니다.
  3. 비용:
    • 액티브 전략 및 합성 ETF 특성상, 운용 보수가 패시브 ETF보다 다소 높을 수 있습니다.

5. 관련 정보

  • 운용사: Kodex(삼성자산운용).
  • 기준 금리: CD 91일물 금리.
  • 구조: 합성 ETF(스왑 계약 등 파생상품 활용).

결론

Kodex CD금리액티브(합성)는 단기 금리 변화에 투자하고자 하는 투자자들에게 적합한 상품입니다. 특히 금리 상승기나 안정적인 현금 대체 상품을 찾는 경우 유용합니다. 다만, 합성 ETF 구조로 인한 리스크를 이해하고 투자 결정을 내리는 것이 중요합니다.

반응형

'투자' 카테고리의 다른 글

역시 국장은 아닌가.  (0) 2025.01.02

 재수 하면서 맘고생이 심했을텐데, 생각보다 성적이 많이 안올라서 고민했는데 다행히 수시에서 합격해서 다행이다. 정시로 갔으면 어려웠을 성적인데, 작년부터 차분히 준비를 하기도 했고 해서 세종대 화학과에 합격했다. 원래 생명과학쪽으로 공부해 보고 싶었는데, 이런저런 고민을 하다가 나름 오래 생각해서 화학과 전공으로 잡고 잘 준비했다고 생각된다.

 

 오후에 아내에게 갑자기 전화가 와서 울고불고 난리이길래 사고라도 났나 걱정했더니 둘째 합격사이트 들어가서 확인해 보고는 합격했다고 그런 거였다. 아내는 둘째 진학 때문에 거의 2년간 맘고생도 심했고 수능 100일 기도도 열심히 나갔는데 다행히 합격을 해서 무척이나 홀가분해 한다. 

 

 나는 지난 4년동안 2명의 고3+재수 세트를 지나오면서 영혼은 물론 돈까지 다 써서 힘들었다. 아버지가 도와주신 덕분에 그나마 한숨 돌렸지만 내 돈으로 모두 내야 했다면 많이 힘들었을 것이다. 아껴 쓴다고 하는데도 워낙에 학원비가 많이 나오니까 월별 카드가 6~700만원이 나오니까 정상적인 생활은 어려웠다. 둘째 학원비+생활비로 월별 200만원 나오고 셋째, 넷째 학원비 + 넷째 자사고 등록금 내고 그러면 정말 남는게 없었다.

 

 어찌 되었거나 우리 아들 꽃길만 걷자. 다행히 회사에서 대학교 등록금 지원이 되서 내년에는 큰 부담없이 지낼 수 있을 것 같다. 내년에는 셋째, 내후년에는 넷째가 대학 수험을 하겠지만 그래도 이제 뭔가 전환점을 돌았다는 생각이 든다. 회사 생활 힘들고 배워야 할 것도 많지만 재미있게 살려고 생각한다. 지금처럼 돈도 많이 주면서 일도 도전적이고 사람들 만나러 다닐 수 있는 일도 없을테니 매사 긍정적으로 일하고 있다.

반응형

'내 이야기' 카테고리의 다른 글

취업이 어려운게 사실이다.  (0) 2025.02.08
내일 출근  (0) 2025.01.30
드라마 - 트렁크  (1) 2024.12.07
투자를 어떻게 해야 하는가?  (9) 2024.12.06
산다는 건 다 그런거 아니겠니?  (1) 2024.11.10

+ Recent posts