Closed SonHyeSeon closed 4 years ago
@SonHyeSeon 님! 불쾌하다니요! 이렇게까지 꼼꼼하게 읽어주셔서 감사할 따름입니다. 말씀주신 질문들을 차근차근 이 이슈 통해 답변 드리겠습니다.
@SonHyeSeon 님, 답변과 관련해 몇 가지 여쭤볼 게 있는데요. 제 메일로 연락 주시면 감사하겠습니다. @SonHyeSeon 님 메일 주소를 이 이슈에 남겨주셔도 됩니다.
@ratsgo님 제 메일 주소 남겨드리겠습니다!
먼저 말씀드릴 수 있는 것부터 순서대로 답 드리겠습니다.
sys.path
함수로 경로 확장하는 부분이 있는데, 코드 3-27에는 이게 없어서 해당 오류가 나는 것 같습니다. 역시 전자책과 정오표에 반영하겠습니다.두 단어가 한 번도 동시에 등장하지 않았을 때 PMI는 음의 무한대로 발산하기 때문에
로 바꾸겠습니다. 이 역시 전자책과 정오표에 반영하겠습니다.벡터 y를 만드는 방식은 이렇다. 이전 k개 단어들을 W라는 단어 행렬에서 참조한 뒤 평균을 취하거나 이어 붙인다. 여기에 U라는 행렬을 내적하고 바이어스 벡터 b를 더해주면 된다. 이렇게 만든 y에 소프트맥스를 취하면 확률 벡터가 된다.
w_(d,n)
은 다음 그래피컬 모델 그림을 보면 토픽의 단어비중 ϕk
와 d번째 문서 n번째 단어가 어떤 토픽인지를 나타내는 변수 z_(d,n)
에 동시에 영향을 받습니다. 이에 본문을 다음처럼 수정하겠습니다. 이는 ϕk와 z_(d,n)에 동시에 영향을 받는다. 의미는 이렇다. 직전 예시에서 z_(3,1) (3번째 문서 첫 번째 단어의 주제)가 토픽2 라고 가정하자. 이제 ϕ2를 보자. 그러면 w_(3,1) (3번째 문서 첫번째 단어)은 돈이 될 가능성이 높다. 토픽2의 단어분포 가운데 돈이 0.313으로 가장 높기 때문이다.
d번째 문서 n번째 단어(w_(d,n))가 실제 j번째 토픽이 될 확률을 깁스 샘플링을 적용해 구하면 수식 5-4와 같다. 이 수식의 표기를 정리한 표는 표 5-4와 같다.
def truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng):
"""Truncates a pair of sequences to a maximum sequence length."""
while True:
total_length = len(tokens_a) + len(tokens_b)
if total_length <= max_num_tokens:
break
trunc_tokens = tokens_a if len(tokens_a) > len(tokens_b) else tokens_b
assert len(trunc_tokens) >= 1
# We want to sometimes truncate from the front and sometimes from the
# back to add more randomness and avoid biases.
if rng.random() < 0.5:
del trunc_tokens[0]
else:
trunc_tokens.pop()
input_file=data/sentence-embeddings/pretrain-data/*
이렇게 정의돼 있는데 전체 데이터(data/processed/pretrain.txt)를 30만줄씩 분리한 텍스트 파일들이 이 경로에 있습니다.
- 6. p106의 코드 3-27에서 /notebooks/embedding 위치에서 python을 실행하면 from bert.tokenization이 아니라 from models.bert.tokenization으로 실행해야 제대로 되는 것 같습니다. 토크나이즈를 전체 자동화하는 스크립트엔
sys.path
함수로 경로 확장하는 부분이 있는데, 코드 3-27에는 이게 없어서 해당 오류가 나는 것 같습니다. 역시 전자책과 정오표에 반영하겠습니다.
from models.bert.tokenization import FullTokenizer
import sys
sys.path.append('models')
from bert.tokenization import FullTokenizer
2번 처럼 sys.path 부분을 추가하니 정상적으로 작동하네요. 감사합니다!
- 19. p165, 코드 4-42, 'self.embeddings = defaultdict(list)' --> self.embeddings = defaultdict(list)) (오른쪽 끝에 우괄호 추가) 저는 다음 같이 이상없이 실행이 되는데요. 혹시 코드 다른 부분에 문제가 있는걸까요? 의견 부탁드립니다.
아 제가 직접 따라 치다가 p165 윗 부분의 'embedding_method)'를 보지 못하고 'self.embeddings=defaultdict(list)'부분이 p164 아래 self.load_word_embeddings 함수의 매개변수라고 착각한 부분이네요. 혼란을 드려 죄송합니다.
- 13. p146, 코드 4-27의 model path 부분 "data/word-embeddings/glove/glove.txt" --> "data/word-embeddings/glove/glove.vecs.txt" 전자책과 정오표에 반영하겠습니다.
glove.txt가 맞지 않나요?
- 13. p146, 코드 4-27의 model path 부분 "data/word-embeddings/glove/glove.txt" --> "data/word-embeddings/glove/glove.vecs.txt" 전자책과 정오표에 반영하겠습니다.
glove.txt가 맞지 않나요?
아 다시 실행해보니 glove.txt가 맞는 것 같네요! 죄송합니다ㅜ
@hccho2 @SonHyeSeon 님 13번 질문과 관련해서 먼저 답해주셔서 감사합니다. 검토할 양이 많다 보니 제가 실수를 했네요. 다시 한번 감사드립니다.
model = Word2Vec(corpus, size=100, workers=4, sg=1, seed=0)
만일 책에 나와있는 유사도 수치들을 그대로 재현해보고 싶다면 이 책에서 제공하는 워드 임베딩들을 다운로드 받아서 평가코드(WordEmbeddingEvaluator)를 실행하면 됩니다. 다운로드는 다음과 같이 하면 됩니다. 이후 코드 4-5나 코드 4-9를 실행해 보세요.
git pull origin master
bash preprocess.sh dump-word-embeddings
임베딩 수행할 때마다 그 유사도 값이 달라지고, 랜덤 시드를 고정하면 같은 결과를 보장받는다는 내용 등은 전자책에도 반영해 두겠습니다.
p.117
네 번째 단어가 running인 데이터를 뽑아보면 그림 4-5와 같다.
>
문장에서 네 번째 단어가 running인 3-gram을 뽑아보면 그림 4-5와 같다.
p.118
다섯 번째 단어가 in인 데이터를 뽑아보면 그림 4-6이 된다.
>
문장에서 다섯 번째 단어가 in인 3-gram을 뽑아보면 그림 4-6이 된다.
- 13. p146, 코드 4-27의 model path 부분 "data/word-embeddings/glove/glove.txt" --> "data/word-embeddings/glove/glove.vecs.txt"
제가 책의 코드 순서대로 실행하다가 처음에 glove 학습 시엔 glove.txt라는 파일이 만들어지지 않아서 저렇게 질문했던 것 같습니다. 코드 뒤쪽에 프리트레인된 단어 임베딩을 다운받으면서 glove.txt 파일이 생성된게 아닐까 싶습니다.
학습 후 생성된 파일은 이렇네요
root@2b80adaefe45:/notebooks/embedding# time python models/train_elmo.py --train_prefix 'data/sentence-embeddings/elmo/pretrain-ckpt/traindata/*' --vocab_file data/sentence-embeddings/elmo/pretrain-ckpt/elmo-vocab.txt --save_dir data/sentence-embeddings/elmo/pretrain-ckpt/ --n_gpus 2
하지만 트레이닝 중에 죽네요
Found 6 shards at data/sentence-embeddings/elmo/pretrain-ckpt/traindata/
Loading data from: data/sentence-embeddings/elmo/pretrain-ckpt/traindata/data_ab
Loaded 100000 sentences.
Finished loading
Found 6 shards at data/sentence-embeddings/elmo/pretrain-ckpt/traindata/
Loading data from: data/sentence-embeddings/elmo/pretrain-ckpt/traindata/data_ae
Loaded 100000 sentences.
Finished loading
WARNING:tensorflow:From /notebooks/embedding/models/bilm/training.py:217: calling squeeze (from tensorflow.python.ops.array_ops) with squeeze_dims is deprecated and will be removed in a future version.
Instructions for updating:
Use the axis
argument instead
USING SKIP CONNECTIONS
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/nn_impl.py:1124: sparse_to_dense (from tensorflow.python.ops.sparse_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Create a tf.sparse.SparseTensor
and use tf.sparse.to_dense
instead.
WARNING:tensorflow:Variable += will be deprecated. Use variable.assign_add if you want assignment to the variable value or 'x = x + y' if you want a new python Tensor object.
[['global_step:0', TensorShape([])],
['lm/CNN/W_cnn_0:0',
TensorShape([Dimension(1), Dimension(1), Dimension(16), Dimension(32)])],
['lm/CNN/W_cnn_1:0',
TensorShape([Dimension(1), Dimension(2), Dimension(16), Dimension(32)])],
['lm/CNN/W_cnn_2:0',
TensorShape([Dimension(1), Dimension(3), Dimension(16), Dimension(64)])],
['lm/CNN/W_cnn_3:0',
TensorShape([Dimension(1), Dimension(4), Dimension(16), Dimension(128)])],
['lm/CNN/W_cnn_4:0',
TensorShape([Dimension(1), Dimension(5), Dimension(16), Dimension(256)])],
['lm/CNN/W_cnn_5:0',
TensorShape([Dimension(1), Dimension(6), Dimension(16), Dimension(512)])],
['lm/CNN/W_cnn_6:0',
TensorShape([Dimension(1), Dimension(7), Dimension(16), Dimension(1024)])],
['lm/CNN/b_cnn_0:0', TensorShape([Dimension(32)])],
['lm/CNN/b_cnn_1:0', TensorShape([Dimension(32)])],
['lm/CNN/b_cnn_2:0', TensorShape([Dimension(64)])],
['lm/CNN/b_cnn_3:0', TensorShape([Dimension(128)])],
['lm/CNN/b_cnn_4:0', TensorShape([Dimension(256)])],
['lm/CNN/b_cnn_5:0', TensorShape([Dimension(512)])],
['lm/CNN/b_cnn_6:0', TensorShape([Dimension(1024)])],
['lm/CNN_high_0/W_carry:0', TensorShape([Dimension(2048), Dimension(2048)])],
['lm/CNN_high_0/W_transform:0',
TensorShape([Dimension(2048), Dimension(2048)])],
['lm/CNN_high_0/b_carry:0', TensorShape([Dimension(2048)])],
['lm/CNN_high_0/b_transform:0', TensorShape([Dimension(2048)])],
['lm/CNN_high_1/W_carry:0', TensorShape([Dimension(2048), Dimension(2048)])],
['lm/CNN_high_1/W_transform:0',
TensorShape([Dimension(2048), Dimension(2048)])],
['lm/CNN_high_1/b_carry:0', TensorShape([Dimension(2048)])],
['lm/CNN_high_1/b_transform:0', TensorShape([Dimension(2048)])],
['lm/CNN_proj/W_proj:0', TensorShape([Dimension(2048), Dimension(128)])],
['lm/CNN_proj/b_proj:0', TensorShape([Dimension(128)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_0/lstm_cell/bias:0',
TensorShape([Dimension(4096)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_0/lstm_cell/kernel:0',
TensorShape([Dimension(256), Dimension(4096)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_0/lstm_cell/projection/kernel:0',
TensorShape([Dimension(1024), Dimension(128)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_1/lstm_cell/bias:0',
TensorShape([Dimension(4096)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_1/lstm_cell/kernel:0',
TensorShape([Dimension(256), Dimension(4096)])],
['lm/RNN_0/rnn/multi_rnn_cell/cell_1/lstm_cell/projection/kernel:0',
TensorShape([Dimension(1024), Dimension(128)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_0/lstm_cell/bias:0',
TensorShape([Dimension(4096)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_0/lstm_cell/kernel:0',
TensorShape([Dimension(256), Dimension(4096)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_0/lstm_cell/projection/kernel:0',
TensorShape([Dimension(1024), Dimension(128)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_1/lstm_cell/bias:0',
TensorShape([Dimension(4096)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_1/lstm_cell/kernel:0',
TensorShape([Dimension(256), Dimension(4096)])],
['lm/RNN_1/rnn/multi_rnn_cell/cell_1/lstm_cell/projection/kernel:0',
TensorShape([Dimension(1024), Dimension(128)])],
['lm/char_embed:0', TensorShape([Dimension(261), Dimension(16)])],
['lm/softmax/W:0', TensorShape([Dimension(100003), Dimension(128)])],
['lm/softmax/b:0', TensorShape([Dimension(100003)])],
['train_perplexity:0', TensorShape([])]]
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/util/tf_should_use.py:189: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use tf.global_variables_initializer
instead.
2020-01-28 12:03:19.774738: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-28 12:03:19.898953: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:964] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-01-28 12:03:19.899387: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties:
name: GeForce RTX 2070 SUPER major: 7 minor: 5 memoryClockRate(GHz): 1.815
pciBusID: 0000:0d:00.0
totalMemory: 7.79GiB freeMemory: 6.55GiB
2020-01-28 12:03:19.972458: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:964] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2020-01-28 12:03:19.972950: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 1 with properties:
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.683
pciBusID: 0000:0e:00.0
totalMemory: 10.92GiB freeMemory: 10.77GiB
2020-01-28 12:03:19.972975: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1
2020-01-28 12:03:20.482839: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-01-28 12:03:20.482880: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988] 0 1
2020-01-28 12:03:20.482888: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0: N N
2020-01-28 12:03:20.482893: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1: N N
2020-01-28 12:03:20.482999: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6293 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2070 SUPER, pci bus id: 0000:0d:00.0, compute capability: 7.5)
2020-01-28 12:03:20.483255: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 10419 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1)
WARNING:tensorflow:Issue encountered when serializing lstm_output_embeddings.
Type is unsupported, or the types of the items don't match field type in CollectionDef. Note this is a warning and probably safe to ignore.
'list' object has no attribute 'name'
Training for 10 epochs and 3002530 batches
세그멘테이션 오류 (core dumped)
안녕하세요
이해하기 쉽게 책을 내주셔서 공부하던 중 발견한 오타들을 제보하고 몇가지 궁금증을 문의하려고 합니다.
[x] 1. transformer 내용 이후로 Pointwise라는 단어가 목차를 포함하여 매우 많이 나오는데(p225, p232, p233, p238 등) 정오표에서 처럼 모두 Position-wise로 수정하면 되는지 궁금합니다.
[x] 2. 코드 실행 후 유사도 평가 시 책의 결과와 다르게 나오는 경우가 많은데 데이터셋의 변화에 따른 정상적인 결과인지, 학습을 잘못 시켜 다른 결과가 나온것인지 궁금합니다.
[ ] 3. p44의 서론 부분에서 GPU로만 학습이 가능한 모델은 ELMo, BERT, 단어 임베딩 파인 튜닝 부분이라 하셨는데 cpu로 실행 시 Word2Vec과 Glove, swivel, 가중임베딩, p106 bert 부분도 잘 실행되지 않았습니다.
[x] 4. p62의 아래에서 2번째 줄, "TF-IDF 행렬 구축 튜토리얼은 4.1절 '잠재 의미 분석' "--> 4.4절
[x] 5. p101의 위에서 7번째 줄, "preprocessmecab-user-dic.csv" --> preprocess/mecab-user-dic.csv
[x] 6. p106의 코드 3-27에서 /notebooks/embedding 위치에서 python을 실행하면 from bert.tokenization이 아니라 from models.bert.tokenization으로 실행해야 제대로 되는 것 같습니다.
[x] 7. p118 그림 4-5 밑에 문단에서 " 다섯 번째 단어가" --> "네 번째 단어가"
[x] 8. p127 위에서 2번째 줄, '가장 높은 단어 10개와' --> '가장 높은 단어 5개와'
[x] 9. ~~p135 자소단위 fasttext 모델의 유사어 상위 목록 체크시 자소단위로 분해된 단어가 출력이 되는데 복원시키는 추가 과정을 직접 처리해야하는것인지 학습을 잘못시킨 것인지 궁금합니다. (추가) word_eval.py의 jamo_to_word 함수를 사용하면 분해된 자소를 단어로 합쳐주는 기능이 있긴하네요. fasttext_jamo의 most_similar함수 실행 시 이부분을 추가해주시면 더 좋을 것 같습니다. ~~
[x] 10. p137, 4.4.1 PPMI 행렬 'PMI Pointwise Mutual Information, 행렬(2장) --> 콤마(,) 삭제
[x] 11.
p143 코드4-22와 코드4-23의 실행결과가 같게 나오던데 다르게 나오는게 정상인지 궁금합니다.(추가) p143에 제공되는 4-21로 학습 한 후 4-22와 4-23을 실행시키니 같은 유사도 목록이지만 유사도 값이 조금씩 다르네요 ㅎㅎ 혼란을 드려 죄송합니다[x] 12. p144 4.5.1의 두 번째 문단에서 '두 단어 동시 등장 빈도의 로그 값 A_ij'는 A_ij가 로그 값을 의미하는건지 해당 부분이 log A_ij을 나타내고 있는것인지 헷갈리네요. 저는 표현이 log A_ij를 나타낸다고 이해하였습니다.
[x] 13. p146, 코드 4-27의 model path 부분 "data/word-embeddings/glove/glove.txt" --> "data/word-embeddings/glove/glove.vecs.txt"
[x] 14. p148, "두 단어가 한 번도 등장하지 않았을 때 PMI는 음의 무한대로 발산하기 때문에" --> 두 단어가 한 번도 동시에 등장하지 않았을 때
[x] 15. p155, 문단에서는 "갑-을+정=병"으로 표시하고 있지만 표 4-7의 열은 갑,을,병,정 순서로 되어 있습니다.
[x] 16. p159, 코드 4-41 [python] 마커가 표시되어 있지 않습니다.
[x] 17. p161, '경제에서 인수 같은 단어가' --> 경제 부분 음영 처리
[x] 18. p163. Continous Bag of Words --> Continuous Bag of Words
[x] 19.
p165, 코드 4-42, 'self.embeddings = defaultdict(list)' --> self.embeddings = defaultdict(list)) (오른쪽 끝에 우괄호 추가)[x] 20. p184의 'y_i를 만드는 방식은 이렇다' 로 시작하는 부분에서 수식 5-2를 참고하면 '바이어스 벡터 b를 더해준 뒤' 까지는 y를 계산하는 부분이고 softmax를 취하면 P를 구하게 되는데 그럼 첫 문장이 확률 p를 구하는 방식이 되어야 하는게 아닌가 싶습니다.
[x] 21. p194의 'w(d,n)은 d번째 문서 내에 n번째로 등장하는 단어'로 시작하는 문단에서 w(d,n)은 블로그 내용을 참고하면 토픽의 단어 비중의 영향을 받는다고 되어있는데 기호가 잘못 표시된게 아닌가 싶습니다.
[x] 22. p195의 아래에서 두번째 줄 (z(d,j))의 앞부분 설명이 'd번째 문서 i번째 단어가 속한 토픽'으로 바뀌거나 괄호안의 변수가 w(d,n)이 되어야 서로 같은 내용을 얘기하게 될 것 같습니다.
[x] 23. p197의 표5-6은 '단어-토픽 행렬'이고 p198의 표5-8은 '단어-주제 행렬'인데 같은 의미인지, 서로 다른 행렬인지 궁금합니다.
[x] 24. p198번에서 깁스 샘플링 시 추정하려는 단어의 토픽 정보를 지운다 했는데 그림 5-12와 그림 5-13은 지우기 전의 분포를 그림으로 나타내고 있는 것 같습니다. 깁스샘플링 추정시 토픽 정보를 지운 분포를 참고하는 것인지 지우기 전의 분포를 참고하는 것인지 잘 이해가 되지 않습니다.
[x] 25. p201 코드 5-21의 python 마커 --> bash 마커
[x] 26. p213의 위에서 4번째 줄, 'ELMo 모델은 입력 문장의 토큰 수만큼의 임베딩들을 반환하게 된다.'라는 문장은 어떤 의미인지 잘 이해가 되지 않아 추가로 설명을 요청드립니다.
[x] 27. p213, 수식 5-5의 L이 정확히 어떤 의미인지 표현해주셨으면 합니다.
[x] 28. p218의 ELMo 프리트레이닝 코드에서 --train_prefix 'data/sentence-embeddings/elmo/pretrain-ckpt/traindata/ --vocab_file ... 이런 식으로 되어 있는데 github의 sentmodel.sh pretrain-elmo에선 뒤에 '를 붙여 실행하고 있는데 sentmodel.sh 과 p218의 소스코드 모두 정상적으로 작동되지 않아 어떤 코드로 실행시켜야 하는지, gpu 1개 사용시 대략적으로 어느 정도의 시간이 소요되는지, 정상적으로 실행되었는지 확인할 수 있는 방법이 있는지 (결과로 어떤 파일이 생성되는지) 궁금합니다.
[x] 29. p219 멀티헤드 어텐션은 5.6.1, 5.6.2 --> 5.5.1, 5.5.2
[x] 30. p219 상단 피드포워드 네트워크는 5.6.3 --> 5.5.3
[x] 31. p223 5.6.1 --> 5.5.1
[x] 32. p231의 'max_num_token을 넘지 못할 때까지'라는 말은 max_num_token과 같거나 작아지도록 제거한다고 이해해도 되는 건지 궁금합니다.
[x] 33. p236의 아래에서 3번째 줄에 '원시 말뭉치가 너무 크면 전처리가 지나치게 느려질 수 있으므로' 라는 부분에서 코드부분을 보면 전처리 수행 후에 데이터를 분리하고 있는데 그렇다면 해당 문장에서의 전처리는 이후의 어휘 집합 구축을 의미하는것인지 어떤 전처리 내용을 말하는 것인지 궁금합니다.
자잘한 오타의 경우 나름대로 수정하여 이해하고 공부하다가 몇가지 질문할 것들이 생겨 질문하는 김에 정리하여 제보하였습니다. 정리도 잘 안되고 두서없는 많은 내용을 문의드려 불쾌하게 해드렸다면 죄송합니다ㅜㅜ