ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI models collapse when trained on recursively generated data
    AI/Analysis 2024. 8. 27. 17:51

    arXiv


    AI models collapse when trained on recursively generated data


    Nature doi: https://www.nature.com/articles/s41586-024-07566-y

     

    추가 정보, arxiv 버전 doi: https://doi.org/10.48550/arXiv.2305.17493

     

    The Curse of Recursion: Training on Generated Data Makes Models Forget

    Stable Diffusion revolutionised image creation from descriptive text. GPT-2, GPT-3(.5) and GPT-4 demonstrated astonishing performance across a variety of language tasks. ChatGPT introduced such language models to the general public. It is now clear that la

    arxiv.org


    1. Introduction

    사람의 의사소통은 온라인상에서 많이 이루어지게 된다. 매일 수억 개의 이메일, SNS 메시지와 뉴스기사 등이 업데이트되고 있다. Worldwide web의 초창기 때 이러한 자료들은 인간에 의해서만 생산되고 관리되었지만, 세기가 바뀌면서 검색 엔진은 사람들이 찾을 수 있는 것을 결정하게 되었고, 지난 10년 동안 철자와 문법을 보정해주는 스마트 텍스트 편집기도 등장하였다. 현재에는 텍스트를 효율적으로 정리하고 분석할 뿐만 아니라, LLM(Large Language Model)을 통해 생성도 가능해졌다. 이러한 LLM은 weaker form of the turing test (인간이 작성한 글과 안정적으로 구분할 수 없다)를 통과할 만큼 많이 발전이 되어있다.

     

    LLM의 개발은 상당히 복잡하고 대량의 데이터를 필요로 한다. 그렇기 때문에, 최근이 LLM은 인터넷의 많은 부분을 스크랩하여 훈련하고, reinforcement learning from human feedback(RLHF)로 추자적인 finetuning을 진행한다. 이러한 학습 방법은 effective dataset size를 더욱 향상시켜주는 역할을 한다.

     

    GPT4를 포함한 현지의 LLMs는 주로 사람이 생성한 text에 대해서 학습이 되었지만, 이는 LLM의 사용량이 많아지면서 변경될 수 있다. 미래의 LLM의 training data도 web에서 스크랩하게 되면 필연적으로 이전 모델이 생산한 데이터에 대해서 교육을 받게 될 것이기 때문이다.

     

    그렇다면, 특정 GPT 버전으로 생성된 텍스트가 그다음 모델의 대부분의 학습 데이터를 형성하게 된다면 어떻게 될까?

     

    Generation n이 증가함에 따라 GPT 버전 GPT-{n}의 성능은 어떻게 될지 본 논문에서 저자들은 분석하였다.

     

    우선 결론만 말하자면, 다른 모델이 생성한 데이터를 통해 학습을 하게되면 model collapse가 발생한다. 시간이 지남에 따라 분포의 변화가 없는 경우에도 모델이 실제 기본 데이터의 분포를 잊어버리게 되는 퇴행적인 process라고 한다.

     

    본 논문은 GMM, VAE, and LLM에 대한 model collapse의 예를 제공한다. 이를 통해, 시간이 지남에 따라 꼬리가 사라지는 것으로 시작하여 실제 분포에 대한 정보가 손실되는 것으로 시작하여 실제 분포에 대한 정보를 잃기 시작하고, 세대에 따라 학습된 행동이 매우 작은 분산을 가지는 point estimate로 수렴되기 시작한다는 것을 보인다. 또한, 이는 long-term learning에 이상적인 조건인 function estimation error가 없는 경우에도 불가피하게 일어나타남을 보였다.

     

    마지막으로 본 논문에서는 model collapse의 더 넓은 의미에 대해서 얘기한다. 이들은 원본 데이터 분포에 접근하는 것이 매우 중요하다는 점을 이야기하고 있다. 기본 분포의 극단적인(꼬리) 부분이 중요한지 학습하려면 실제 인간이 생성한 데이터에 접근해야 한다. 즉, 대규모로 인터넷에 콘텐츠를 게시하는 데 LLM을 사용하는 것은 이러한 모델을 훈련시키기 위한 데이터 수집을 오염시키는 행위라는 것이다.

     

    그러므로, 앞으로 인간과 LLM간의 상호작용에 대한 데이터는 점점 더 가치 있게 될 것이다.


    2. What is Model Collapse?

    Model collapse (모델 붕괴)는 학습된 생성모델 세대에 영향을 미치는 퇴행적 prcoess로, 생성된 데이터가 결국 차세대 모델의 훈련세트를 오염시키는 것이다. 이로 인해, 오염된 데이터에 대해 훈련을 받는 모델은 훈련을 받다 현실을 잘못 인식하게 된다.

     

    모델 붕괴는 크게 early model collapse(초기 붕괴) and late model collapse(후기 붕괴) 두 가지로 나누어 볼 수 있다.

    Early model collapse (초기 붕괴)  분포의 꼬리에 대한 정보를 잃기 시작한다.
    Late model collapse (후기 붕괴) 모델이 원래 분포의 다양한 모드를 얽히게 하여 원래 분포와 거의 유사하지 않은 분포로 수렴하게 되며, 종종 매우 작은 분산을 가진다.

     

    이 과정은 여러 모델이 시간에 걸쳐 작용하는 상황을 고려하고 있다는 점에서 catastrophic forgetting 과정과는 다르다. 여기서 모델들은 이전에 학습한 데이터를 잊는 것이 아니라, 스스로의 신념을 강화함으로써 실제로 존재하는 것으로 잘못 해석하기 시작한다.

     

    이 과정은 세 가지 특정한 오류 원인이 세대를 거듭할수록 복합적으로 작용하여 원래 모델과의 편차를 초래하기 때문에 발생한다. 이 중 하나의 오류 원인은 주된 역할을 하며, 이 오류가 없다면 첫 번째 세대 이후에는 이 process는 발생하지 않을 것이다.

     

    2.1 Causes of model collapse

    모델 붕괴에는 위에서 설명하였듯이 두 가지 주요 원인이 있으며, 하나는 기본 원인이고 다른 하나는 부차적인 것이다.

    1. Statical approximation error (통계적 근사 오차)
      • 주된 이유의 오류, 샘플 수가 유한하기 때문에 발생한다.
      • 모든 re-sampling 단계에서 정보가 손실될 확률이 0이 아니기 때문에 발생한다.
      • 예를 들어, single-dimension gaussian을 유한한 샘플 수로 근사할 때, 매우 많은 점을 사용하더라도 오류는 여전히 상당히 클 것이다.
    2. Funtional expressivity error (기능적 표현 오류)
      • 이는 부차적인 유형의 오류로, 함수 근사치의 표현력이 제한되어 있기 때문에 발생한다. 특히, 신경망은 크기가 무한대에 이르기 때문에 보편적인 근사치에 불가하다.
      • 결과적으로 신경망은 원래 분포의 지지 범위 밖에서 0이 아닌 확률을 도입하거나, 지지 범위 내에서 0의 확률을 도입할 수 있다.
      • 간단한 예는 두 개의 가우시안 혼합을 하나의 가우시안으로 맞추려는 시도를 들 수 있다. 데이터 분포에 대한 완벽한 정보 (즉, 무한한 샘플)가 있다고 해도, 모델 오류는 불가피하다. 그러나 다른 두 가지 유형의 오류가 없는 경우, 이 오류는 첫 번째 세대에서만 발생할 수 있다.
    3. Functional approximation error (함수 근사치 오류)
      • 이것은 주로 학습 절차의 한계에서 비롯되는 부차적인 유형의 오류이다.
      • 예를 들어, 확률적 경사 하강법의 구조적 편향이나 목표 선택에 따른 오류가 있다.
      • 이 오류는 각 세대에서 무한한 데이터와 완벽한 표현력이 있을 때 발생하는 오류로 볼 수 있다.

    위의 각 오류는 모델 붕괴를 악화시키거나 개선할 수 있다. 더 나은 근사력은 통계적 잡음을 상쇄하여 실제 분포에 대한 좋은 근사를 제공할 수 있지만, 동시에 이 잡음을 증가시킬 수도 있다. 대부분의 경우, 개별 부정확성이 결합되어 전체 오류가 증가하는 연쇄효과를 발생한다고 한다. 예를 들어, 밀도 모델(density model)을 overfitting하면 모델이 잘못된 외삽을 하여 training set에서 다루지 않은 저밀도 영역에 높은 밀도를 부여할 수 있으며, 이러한 영역이 임의로 자주 샘플링될 수 있다. 또한, 컴퓨터는 실생활에서 한정된 정밀도를 가지므로 다른 유형의 오류도 존재함을 주목할 가치가 있다고 한다.


    3. Theoretical intuition

    이들은 모델 붕괴는 이전 세대에서 생산된 데이터를 반복적으로 훈련하는 생성 모델에서는 보편적이라고 주장한다.

     

    위에서 설명한 오류의 근원들을 두 가지 수학적 모델을 통해 정량화하며, 이 모델들은 관심 있는 수량에 대한 분석적 표현을 제공하기에 충분히 간단하면서도, 모델 붕괴현상을 묘사할 수 있다. 이 모델들은 functional expressivity and statistical errors가 없는 discrete distribution과 결합 함수 표현과 통계적 오류를 묘사한 multi-dimensional gaussian approximation로 이루어진다. 또한, 더 복잡한 Hilbert spaces에서 밀도 추정의 더 복잡한 설정에 대한 세 가지 모두의 영향을 추가로 실험하였다고 한다.

    이들이 고려한 전체 stochastic prcoess 는  "generational data"에 따른 학습이다.

    Generation i 에서의 데이터셋 D_i는 독립적이고 동일하게 분포된 확률 변수 X(_j)(^i)로 구성된다. 이때, p_i는 데이터셋의 크기를 나타낸다.

     

    Generation i 에서 generation i+1로 이동할 때, 이들은 데이터셋 D_i에서 표본들의 분포를  pθ_(i+1) 근사하고자 한다.

    이 단계를 functional approximation 라고 하며, 아래와 같은 수식으로 나타낸다.

    functional approximation

    데이터셋 D_(i+1) 은 아래와 같은 수식으로 샘플링된다.

    데이터세 샘플링

    위의 수식에서 음수가 아닌 parameter

     

     

    3.1. Discrete distributions with exact approximation

     

    이 경우 모델 붕괴는 sampling 단계에서 발생하는 통계적 오류 때문에만 발생한다.

    처음에는 낮은 확률의 사건(꼬리 부분)이 sampling될 확률이 낮아지면서 사라지기 시작하여, 시간이 지남에 따라 분포의 지지 부분이 축소된다.

    샘플의 크기를 M으로 표시하고, 상태 i의 확률 q가 1/M이하라고 가정하며, 해당 사건으로부터 나오는 i 값의 예상 샘플수는 1보다 작다. 이는 실제로 이러한 정보가 손실된다는 것을 의미한다. 이는 위 그림에서 드물게 일어나는 event들(꼬리 부분)이 잘려나가는 것을 확인함을 통해알 수 있다. 일반적으로 q 확률을 가진 상태 i를 고려할 때, 표준 조건부 확률을 사용하여 정보 손실(즉, 특정 세대에서 데이터를 샘플링하지 않는 것)의 확률이 1-q와 같음을 보여줄 수 있다. 이는 분포가 특정 상태에 위치한 델타 함수로 수렴해야 함을 의하며, 해당 상태에서 끝날 확률은 원래 분포에서 해당 상태를 샘플링할 확률과 동일하다.

     

    • 모델에 미치는 영향
      • 샘플링되지 않을 확률이 1-q로 매우 크다면, 샘플링 과정에서 상태 i가 선택되지 않을 가능성이 높아진다. 이는 모델이 이 상태에 대한 정보를 얻지 못하는 것을 의미한다.
      • 만약 상태 i가 여러 세대에 걸쳐 샘플링되지 않는다면, 모델은 이 상태에 대한 정보를 점점 잃게 될 것이다.
    • 분포가 델타 함수로 수렴
      • 델타 함수는 특정한 한 점에 모든 확률이 집중되는 함수이다. 상태 i가 샘플링되지 않으면서 모델은 해당 상태에 대한 정보를 잃어버리게 되고, 이는 결국 모델이 특정한 다른 상태로 집중된 분포로 수렴하게 된다.
      • 예를 들어, 원래 분포에서 여러 상태가 존재했더라도, 특정 상태 i에 대한 정보가 계속 손실되면, 모델은 남은 상태들 중 하나에만 집중하게 된다. 이로 인해 분포는 특정 상태에만 확률을 집중하는 델타 함수로 수렴하게 된다.
    • 원래 분포와 샘플링 확률의 관계
      • 델타 함수로 수렴할 때, 특정 상태에서의 확률은 원래 분포에서 해당 상태가 샘플링된 확률과 동일하게 된다. 즉, 샘플링 과정에서 어떤 상태가 자주 샘플링 된다면, 이 상태는 델타 함수로 수렴하는 과정에서 높은 확률로 유지될 것이다.

    그렇다면 이 과정이 어떻게 분포를 델타 함수로 변하게 하는지 직접으로 어떻게 보여줄 수 있는가?

    이 과정을 X_i -> F_ θ -> p_(i+1) -> X_(i+1) 로 고려하면, X_(i+1)은 오직 X_i에만 의존하기 때문에 이 과정이 Markov Chain을 형성한다는 것을 알 수 있다.

    모든  X_i 가 동일한 값만 가지는 경우, 다음 세대에서 근사된 분포는 정확히 델타 함수가 되며, 따라서 모든 X_(i+1) 도 동일한 값을 가지게 된다. 그러므로, Markov Chain이 적어도 하나의 흡수 상태(더 이상 상태가 변하지 않는 상태)를 포함하게 되며, 확실하게 이 흡수 상태중 하나로 수렴하게 된다.

     

    결과적으로, model collapse의 process를 따라가다 보면, chain이 흡수될 때 원래 분포의 모든 정보를 잃고 일정한 상태에 도달하게 된다. 해당 논리는 부동 소수점 표현이 이산적이기 때문에, 모델의 파라미터에 대한 Markov chain은 이산적이 되므로 일반적으로 성립하는 논리라고 한다.

    따라서, 초기 모델 붕괴와 후기 모델 붕괴는 기능적 근사가 존재하는 이산 분포에서 반드시 발생하게 된다고 한다.

     

    3.2. Multidimensional Gaussian

    본 논문의 저자들은 두 번째로, 평균과 분산의 편향되지 않은 추정치를 사용하여 각 세대를 근사화하는 Gaussian approximation setting을 통해 일반적인 결과를 제시하였다.

     

    Original data가 non-Gaussian (정규분포가 아님)일 수도 있는 distribution D_0 에서 샘플링되었고, 샘풀 분산이 0이 아닌 경우를 가정한다.

    X^n은 이전 세대의 편향 없는 평균과 분산 추정치를 사용하여 재귀적으로 맞추어졌으며, 고정된 샘플 크기를 가진다.

     

    • 세대별 데이터 생성 및 가우시안 근사
      • 각 세대마다, 모델은 이전 세대의 데이터 분포를 가우시안으로 간주하고, 평균과 분산을 계싼하여 다음 세대의 데이터를 생성한다.
      • Generation 1: 첫 번째 세대에서는, 초기 데이터가 있을 것이다. 모델은 이 데이터를 가우시안 분포로 근사하여, 평균과 분산을 계산한다.
      • Generation 2: 두 번째 세대에서는, 첫 번째 세대에서 계산된 가우시안 분포를 기반으로 새로운 데이터를 생성한다. 이 데이터는 가우시안 분포를 따르게 된다.
      • Generation 3 이후: 이 과정을 반복하면서, 각 세대마다 이전 세대의 데이터를 기반으로 새로운 가우시안 분포를 계산하고, 그 분포에 따라 새로운 데이터를 생성한다.

    위의 과정에서 데이터가 실제로 가우시안 분포를 따르지 않을 경우에도 모델이 이를 가우시안 분포로 간주하고 근사하려고 한다는 것이 중요하다. 이로 인해 세대를 거듭하면서, 원래의 데이터 분포와 생성된 데이터 분포 사이에 차이가 발생하게 되며, 결과적으로 모델 붕괴가 발생할 수 있다. 모델은 점점 더 특정한 갑셍 데이터를 집중시키게 되며, 분산이 줄어들면서 데이터가 단순화되는 현상이 나타나게 된다.

     

    이를 수식으로 표현하면 아래와 같은 수식으로 정리할 수 있다고 한다:

     

    위 수식을 통해, n번째 세대의 데이터 분포화 원래 데이터 분포 사이의 Wasserstein-2 거리의 제곱의 기댓값이 무한대로 발산함을 확인할 수 있다. 즉, 모델이 생성하는 데이터 분포가 점점 더 원래 데이터 분포와 다르게 변하고 있다는 것을 의미한다.

    또한, 세대가 증가함에 따라 분산이 0으로 수렴함을 확인할 있는데, 이는 모델이 점점 더 데이터의 분산을 줄이면서, 특정한 값 또는 매우 좁은 범위에 데이터를 집중시키게 된다는 것을 나타낸다.

     

    이 결과는 이산적인 경우에서 관찰되는 것과 매우 유사하며, 이 정리는 후기 모델 붕괴의 효과를 설명하고 있다.

    모델이 생성하는 데이터 분포와 원래 데이터 분포 사이의 차이가 점점 커지며, 결국 모델이 생성하는 데이터가 원래 데이터와 매우 달라지게 된다.

    또한, 모델이 반복적으로 데이터를 생성하면서, 그 데이터의 분산이 점점 줄어들어 결국 거의 모든 데이터가 하나의 값 또는 매우 좁은 범위에 집중하게 된다.

    이 결과는 이산적인 경우에서 관찰된 것과 매우 유사하며, 이 정리는 후기 모델 붕괴의 효과를 설명한다. 여기서 process는 0에 가까운 분산으로 붕괴하기 시작하며, 초기 모델 붕괴의 경우도 관찰될 수 있다.


    4. Model Collapse in Language Models

    본 논문의 저자들은 언어 모델 훈련에서 가장 일반적으로 사용되는 설정, 즉 최신 데이터로 사전 훈련된 모델을 기반으로 한 fine-tuning 방식을 평가하였다. 여기서 사용되는 데이터는 다른 fine-tuning이 적용된 사전 훈련 모델에서 추출된 데이터다. 중요한 점은, 모델이 이전 세대의 fine-tuning된 모델을 사용하는 대신, 초기 상태의 고정된 사전 훈련 모델을 유지한 채, 데이터만 교체하여 fine-tuning을 진행한다는 것이다.

    원래 데이터셋 전체를 학습하고, 동일한 크기의 artificial dataset을 생성한다.

    원래 데이터셋을 모두 살펴보고 모든 block을 예측하기 때문에 모델에 오류가 0인 경우 wikitext2 데이터 세트가 그대로 생성될 것이다.

    각 세대별 훈련은 원래 훈련 데이터에서 생성으로 시작한다.

    각 실험은 다섯 번 실행되었으며, 결과는 서로 다른 무작된 seed로 다섯 개의 별도 실행으로 표시된다.

    마지막으로 가능한 한 현실적으로 실험하기 위해, 다섯번의 작업에서 최고의 성능을 발휘하는 모델을 후속 세대의 기준 모델로 사용하였다. 이를 통해, 실제로 모델 붕괴가 더욱 두드러질 수 잇음을 의미한다.

     

    해당 논문에서는 두 가지 설정을 고려하여 실험을 진행하였다.

     

    [ Five epochs, no original training data ]

    여기서 모델은 원래 데이터셋에서 시작하여 다섯 번의 epoch 동안 훈련되지만, 이후 실행에는 원래 데이터가 보존되지 않는다.

    생성된 데이터로 훈련하면 기존 task에 적응할 수 있으며, 성능이 일부떨어지지만 사용하지 못할 정도는 아님을 확인할 수 있다.

     

    [ Ten epochs, 10% of original training data preserved ]

    여기서 모델은 원래 데이터 셋에서 10 epoch 동안 훈련되며, 훈련의 각 새로운 세대마다 원래 데이터 포인트의 무작위 10% sampling 된다.

    원래 데이터를 보존하면서 모델의 fine-tuning을 개선할 수 있으며, 성능 저하도 미미하다.

     

    두 가지 훈련 방식 모두 모델 성능 저하를 초래하하지만, 생성된 데이터로 학습하는 것은 가능하며 모델은 기본 작업을 성공적으로 학습할 수 있음을 확인할 수 있다.

     

    그러나, 이때 위 그림들을 통해 확인할 수 있듯이, model collapse가 발생하는 것을 확인할 수 있다.

    이는 복잡도가 낮은 샘플의 밀도가 세대에 걸쳐 축척되기 시작하기 때문이다. 따라서 몇 세대에 걸쳐 샘플링된 데이터가 델타 함수와 유사하게 붕괴될 가능성이 높다.

     

    여기서 관촬된 것은 이전 섹션 "Theoretical intuition"에서 확린된 일반적인 직관과 일치한다.

    모든 실험에서 세대별 학습은 유한한 세대 수에서만 수행되며, "Theoretical intuition" 주장은 대부분 세대가 무한대로 갈 때의 한계에서 제시된다.

     

    위의 VAE와 GMM에 대한 실험에서 확인할 수 있듯이, 델타 함수로의 수렴과 그러한 수렴의 특정 비율은 고려된 문제의 구체적인 상황과 밀접하게 관련되어 있으며, 적은 반복으로도 완전한 붕괴가 발생할 수 있다. 몇 세대 이후에도 원래 모델에서 상단한 발산이 발생할 수 있다.

     

    즉, 해결하고자 하는 문제에 따라 붕괴시점이 다를 수 있음을 시사하며, 세대의 반복이 많지 않더라도 적은 세대 반복만으로도 붕괴가 발생할 수 있음을 의미한다.

     

     

    해당 히스토그램은 실제 wikitext2 훈련 데이터를 사용해 처음 개발된 모델에 의해 평가된 세대별 모델이 생성한 개별 데이터 포인트의 perpelxity를 표시한 것이다.

    • 처음 개발된 모델
      • 처음 개발된 모델은 처음에 실제 데이터를 학습하여, 특정 패턴이나 시퀀스를 생성할 가능성이 높다.
      • 이 모델은 데이터를 학습한 후, 해당 데이터를 기반으로 텍스트 시퀀스를 생성할 것이다.
    • 세대별 모델
      • 이전 세대의 모델이 생성한 데이터를 사용하여 학습된 모델, 예를 들어, 두 번째 세대의 모델은 첫 번째 세대 모델이 생성한 데이터를 학습하여 만들어 진다.
      • 세대가 거듭될수록 모델이 여러 세대에 걸쳐 학습되면서, 세대별 모델들은 원래 모델이 자주 생성했던 시퀀스(높은 가능성을 가진 시퀀스)를 더 많이 생성하는 경향이 생긴다. 즉, 세대가 거듭될 수록, 세대별 모델들이 원래 자주 생성했던 텍스트를 더 많이 생성하게 되는 것이다.

    이는 VAE와 GMM의 경우와 유사하다.

    세대를 거듭하면서 모델들이 원래 모델이 더 높은 확률로 생성할 수 있는 샘플을 생성하기 시작하지만, 동시에 생성된 데이터는 훨씬 긴 꼬리를 가지게 되며, 일부 데이터는 처음 개발된 모델이 절대 성성하지 않았을 데이터로 구성하게 된다.

    이는 세대별 누적으로 인한 학습 오류가 누적된 결과이다.

     

    모델 붕괴의 예시


    이 논문을 통해 나는 인간이 만든 데이터가 가지는 다양성이 인공지능 모델의 학습에 있어 매우 중요한 요소임을 확인할 수 있었다. 앞으로 회사에서 인공지능 모델을 개발하고, 이를 유지보수하며 지속적으로 고도화하기 위해서는 단순히 크롤링을 통한 무작위 데이터 수집만으로는 한계가 있을 수 있다. 오히려, 인간이 직접 생성한 양질의 데이터를 얼마나 많이 확보하고 활용할 수 있는지가 더욱 중요해질 것이라는 점을 느끼게 되었다.

     

    해당 논문에서의 실험은 데이터를 생성하는 이전 세대와 생성된 데이터를 학습하는 다음 세대의 모델을 동일한 모델로 사용하여 진행되었기 때문에, 학습할 다음 세대의 모델이 이전 세대의 모델과 다른 구조를 가질 경우에도 같은 결과를 보일지는 추가적인 실험을 통해 검증이 필요하다. 예를 들어, 다음 세대의 모델이 더 복잡한 아키텍처나 다른 종류의 사전 훈련을 사용하는 경우, 이전 세대 모델에서 생성된 데이터가 본 논문과 같이 모델의 붕괴를 야기하는지에 대한 여부는 불확실하다. 따라서, 모델 간의 차이 있을때 생성된 데이터가 모델의 학습에 미치는 영향을 심도 있게 분석하는 연구가 필요하다고 생각한다.

Designed by Tistory.