대규모 언어 모델(Large Language Models, LLMs)

1. LLM이란?

  • "Large Language Model"의 약자로, 대규모 언어 모델을 의미
  • 대량의 텍스트 데이터에서 학습하여 자연어 이해(NLU, Natural Language Understanding)와 자연어 생성(NLG, Natural Language Generation) 능력을 발휘함
  • 문맥을 이해하고, 질문에 답변하며, 문서를 요약하고, 새로운 텍스트를 생성하는 등 다양한 자연어 처리 작업에 사용됨

2. LLM의 등장

  • 2020년 OpenAI의 GPT-3 발표로 LLM이 세계 무대에 전면적으로 등장함
  • 2022년 하반기 GPT-3.5, 2023년 상반기 GPT-4 발표로 LLM 및 생성 AI에 대한 관심이 급증함
  • OpenAI의 GPT 시리즈, Google의 Bard와 Gemini 등이 대표적임

3. LLM의 발전

  • LLM은 인공 지능과 기계 학습, 특히 딥러닝 기술을 기반으로 개발됨
  • LLM의 핵심 가치는 방대한 정보를 처리하고 이해할 수 있는 능력에 있음
  • 챗봇, 번역, 콘텐츠 추천, 작문 등 다양한 분야에서 활용됨.
  • 특정 분야의 지식을 학습하여 전문가 수준의 답변을 제공할 수도 있음 (RAG)

LangChain 소개

1. LangChain이란

  • LLM을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 수 있는 프레임워크
  • 챗봇, 질의응답(QA), 요약 등 다양한 용도로 활용

2. 주요 특징

  • LLM 애플리케이연 개발에 필요한 다양한 구성 요소를 "연결(chain)"하는데 중점
  • 다양한 LLM 모델, 프롬프트 템플릿, Retriever 등을 제공
  • 사용자는 다양한 요소를 "연결(chain)"하는 방식으로 편리하게 시스템 개발 및 구현 가능

LangChian, 주요 LLM 라이브러리 설치

  • langchain : LLM 애플리케이션 개발 프레임워크
  • langchain-openai : LangChain 프레임워크 내에서 OpenAI의 모델을 손쉽게 사용할 수 있도록 하는 확장 패키지
  • openai : OpenAI API를 통해 접근하고 사용할 수 있도록 해주는 공식 Python 클라이언트
  • google-generativeai : 구글이 제공하는 생성 AI 모델을 지원하는 파이썬 클라이언트
  • cohere : 자연어 이해 및 생성을 위한 AI 모델을 제공하는 Cohere 플랫폼의 파이썬 클라이언드

필요한 라이브러리를 먼저 설치한다. 랭체인은 프로젝트 변경이 자주 일어나는 편이다. 버전에 따라 구문이 자주 달라지기 때문에, 개발 단계에서도 버전을 고정해서 사용하는 것이 좋을 것 같다.

!pip install -q langchain==0.1.6 langchain-openai==0.0.5 langchain_google_genai==0.0.6 openai==1.12.0 google-generativeai==0.3.2 cohere==4.47

OpenAI 인증키 설정

 

Product

Our API platform offers our latest models and guides for safety best practices.

openai.com

API를 사용하려면 인증키를 발급한다. 유료이기 때문에 결제 정보 등록이 필요하다. 

import os

os.environ['OPENAI_API_KEY'] = 'OPENAI_API_KEY'

LLM Chain

  • 프롬프트 템플릿에 있는 정보만을 사용하여 응답(가장 기본적인 형태)
  • 사용자로부터의 입력(질문)을 받고, 미리 정의된 프롬프트 템플릿에 기반해 LLM이 응답을 생성

OpenAI의 기본 모델인 GPT-3.5를 지정하고, "2022 카타르 월드컵 우승 국가는?" 라는 질문을 해본다. 아직 카타르 월드컵이 열리지 않았다는 답변을 하고 있다. 최신 정보가 학습되지 않았다는 사실을 알 수 있다. 

# GPT 3.5
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model_name='gpt-3.5-turbo-0125')

질문:

llm.invoke("Who won the Qatar World Cup in 2022?")

답변:

AIMessage(content='As of now, the Qatar World Cup in 2022 has not taken place yet. The tournament is scheduled to be held from November 21 to December 18, 2022.')

 

이번에는 GPT-4를 사용해서 같은 질문을 해본다. 답변을 보면 2021년 10월까지 학습한 정보를 기반으로 대답하고 있다. 2022년 정보까지는 학습이 되지 않은 것으로 보인다. (이처럼 최신 정보를 답변하지 못하는 약점이 있다. 이런 문제 해결을 위해 검색 API를 사용해서 최신 정보를 질문과 함께 제공하고 답변을 얻는 RAG 기법이 활용된다.)

# GPT 4
llm2 = ChatOpenAI(model_name='gpt-4')

질문:

llm2.invoke("Who won the Qatar World Cup in 2022?")

답변:

AIMessage(content='As of my knowledge up to October 2021, the Qatar World Cup in 2022 has not yet taken place. Therefore, the winner is not known.')

 

랭체인의 체인을 구성하는 간단한 예제를 만들어본다. 프롬프트 템플릿을 만들고 input 필드를 통해서 사용자의 입력을 받도록 한다. 

# 프롬프트 템플릿
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are an expert in renewable energy."),
    ("user", "{input}")
])

print(prompt)
input_variables=['input'] messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], template='You are an expert in renewable energy.')), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], template='{input}'))]

 

앞에서 정의한 프롬프트와 llm 모델을 랭체인의 LCEL 문법을 활용하여 체인으로 연결한다. 사용자의 입력(input)이 프롬프트 템플릿으로 전달된다. input 필드에 사용자의 입력이 들어가서 프롬프트 텍스트가 완성된다. 프롬프트의 출력이 그 다음 순서의 체인 요소인 llm 모델의 입력으로 전달되고, 모델은 사용자의 입력에 대한 답변을 최종 출력한다. 

 

# Chain 구성

chain = prompt | llm

chain.invoke({"input": "What are the most promising renewable energy sources for the future?"})

출력:

AIMessage(content="There are several renewable energy sources that show great promise for the future, including:\n\n1. Solar power: Solar energy is abundant, clean, and can be harnessed using photovoltaic cells or concentrated solar power systems. With advancements in technology and decreasing costs, solar power is becoming increasingly competitive with traditional fossil fuels.\n\n2. Wind power: Wind energy is another abundant and clean resource that can be harnessed to generate electricity. Wind turbines are becoming more efficient and cost-effective, making wind power a viable option for meeting energy needs.\n\n3. Hydropower: Hydropower, or energy generated from flowing water, is one of the oldest and most widely used renewable energy sources. With the potential for both large-scale hydroelectric dams and small-scale run-of-river projects, hydropower continues to be a reliable source of clean energy.\n\n4. Geothermal energy: Geothermal energy harnesses heat from the Earth's core to generate electricity or provide heating and cooling. This renewable energy source is reliable and available 24/7, making it a promising option for the future.\n\n5. Biomass: Biomass energy is derived from organic materials such as wood, agricultural residues, and waste. Biomass can be converted into biofuels, biogas, or used directly for heating and electricity generation, providing a versatile and sustainable energy source.\n\n6. Tidal and wave energy: Tidal and wave energy capture the power of ocean currents and waves to generate electricity. While still in the early stages of development, these technologies have the potential to provide a consistent and predictable source of renewable energy.\n\nOverall, a combination of these renewable energy sources, along with advancements in energy storage technologies and grid integration, will play a crucial role in transitioning to a more sustainable and decarbonized energy system in the future.")

 

 

Google Gemini

 

Build with the Gemini API  |  Google AI for Developers

Integrate the Gemini API, quickly develop prompts, and transform ideas into code to build AI apps.

ai.google.dev

구글의 생성 AI인 Gemini를 사용해서 같은 작업을 처리해본다. 

os.environ["GOOGLE_API_KEY"] = "GOOGLE_API_KEY"

모델 정의:

from langchain_google_genai.chat_models import ChatGoogleGenerativeAI

gemini = ChatGoogleGenerativeAI(
    model="gemini-pro",
    temperature=0.5,
    convert_system_message_to_human=True,
    )

질문:

gemini.invoke("Who won the Qatar World Cup in 2022?")

답변: (Gemini의 출력에는 최신 정보가 반영되는 것으로 보인다. 2022년 카타르 월드컵의 우승국가를 아르헨티나라고 정확하게 답변하고 있다.)

 

AIMessage(content='Argentina')

 

체인 구성:

gemini_chain = prompt | gemini

gemini_chain.invoke({"input": "What are the most promising renewable energy sources for the future?"})

최종 출력:

AIMessage(content="1. **Solar Energy:** \n - Solar photovoltaic (PV) systems convert sunlight directly into electricity. \n - Solar thermal systems use sunlight to heat water or air for various applications. \n - The cost of solar panels has been decreasing, making solar energy more affordable. \n\n\n2. **Wind Energy:** \n - Wind turbines harness the kinetic energy of the wind to generate electricity. \n - Offshore wind farms have the potential to provide large amounts of clean energy. \n - Floating wind turbines can access stronger winds and reduce visual impact. \n\n\n3. **Hydropower:** \n - Hydropower plants use the energy of flowing water to generate electricity. \n - Pumped-storage hydropower systems can store energy for later use. \n - Small-scale hydropower systems can be implemented in remote areas. \n\n\n4. **Geothermal Energy:** \n - Geothermal power plants use heat from the Earth's interior to generate electricity. \n - Geothermal energy can also be used for heating and cooling buildings. \n - Enhanced geothermal systems can access deeper and hotter resources. \n\n\n5. **Biomass Energy:** \n - Biomass power plants burn organic materials, such as wood, agricultural waste, or municipal solid waste, to generate electricity. \n - Biomass energy can also be used for heating and cooking. \n - Advanced biomass conversion technologies, such as gasification and pyrolysis, can improve efficiency and reduce emissions. \n\n\n6. **Ocean Energy:** \n - Ocean energy technologies harness the energy of waves, tides, and ocean currents to generate electricity. \n - Wave energy converters can capture the energy of surface waves. \n - Tidal turbines can extract energy from the movement of tides. \n - Ocean thermal energy conversion (OTEC) systems utilize the temperature difference between warm surface waters and cold deep waters to generate electricity. \n\n\n7. **Hydrogen Energy:** \n - Hydrogen fuel cells can generate electricity through a chemical reaction between hydrogen and oxygen. \n - Hydrogen can be produced from renewable energy sources, such as solar and wind, through electrolysis. \n - Hydrogen can be stored and transported, making it a versatile energy carrier.")

 

데이터 분포가 직선 형태인 선형관계일 때 사이킷런의 선형회귀 모형인 LinearRegression 클래스는 매우 정확한 예측력을 갖습니다. (이전 포스팅 참조)

 

만약에, 데이터 분포가 복잡하여 이런 선형관계를 인식하지 못한 상태에서도 머신러닝 또는 딥러닝 학습을 통해 선형관계라는 것을 찾아낼 수 있을까요?  

우리가 머신러닝 또는 딥러닝 알고리즘을 데이터 분석에 기반한 예측에 활용하는 이유가 여기에 있습니다. 데이터 갯수가 많거나 분포가 복잡할 수록 인간의 인지능력으로 어떤 패턴을 인식하는 것은 어렵습니다. 하지만, 머신러닝 또는 딥러닝 알고리즘을 잘 활용하면, 복잡하거나 잘 드러나지 않는 패턴을 찾을 수가 있습니다. 

앞의 예제에서 사용한 데이터셋을 가지고, 딥러닝 알고리즘을 적용해보겠습니다. 

텐서플로우(케라스) 불러오기

 

구글 코랩은 텐서플로우(tensorflow) 2.0을 지원하기 때문에, 따로 설치하지 않아도 사용할 수 있습니다. 케라스(kears)도 통합되어 지원됩니다. 다음과 같이 케라스 모듈을 불러옵니다.

>>> from tensorflow import keras
>>> from tensorflow.keras.layers import Dense

 

딥러닝 모델 객체 정의하기

 

Sequential 클래스 함수를 사용하여 신경망 객체를 생성합니다. 여러 층의 레이어를 순차적으로 연결하는 형태의 심층신경망(DNN)을 구성할 때 사용합니다. 완전연결층 Dense 레이어를 add 명령을 사용하여 추가합니다. units=1 인자는 목표변수(타겟 레이블)의 출력 데이터가 1가지 종류라는 뜻입니다. 회귀 문제는 하나의 단일 값을 예측하기 때문에 1로 지정합니다. input_shape=(1,) 옵션은 입력 데이터인 설명변수(x 변수)의 데이터 구조를 지정합니다. 여기서는 1개의 열, 즉 입력 변수인 x가 1개라는 뜻입니다.

 

compile 명령을 사용하여, 옵티마이저 함수와 로스 함수를 정의합니다. 로스 함수는 예측값의 오차를 측정하는 기준이 되고, 옵티마이저 함수는 오차를 줄이는데 사용하는 최적화 알고리즘입니다. 자세한 설명은 나중에 다루기로 하고 일단 넘어가겠습니다.

 

최종적으로, 1개의 레이어를 갖는 간단한 신경망 모델이 완성되었습니다.

>>> dnn = keras.Sequential()
>>> dnn.add(Dense(units=1, input_shape=(1,)))
>>> dnn.compile(optimizer='sgd', loss='mse')

 

summary 명령을 사용하여 인공신경망의 구조를 출력해서 확인할 수 있습니다. 입력 변수인 x 변수가 1개이므로, x 변수의 계수와 상수항(일차함수식의 y=ax + b를 생각하자)까지 2개의 파라미터가 있습니다.

>>> dnn.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)   Output Shape    Param #
=================================================================
dense (Dense)   (None, 1)        2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

 

주어진 데이터로 모델 학습시키기

 

학습을 위한 설명변수 데이터(x_new)와 목표값인 타겟 레이블 데이터(y)를 신경망 모델에 주입하고 학습을 진행합니다. fit 메소드를 사용하는 점은 앞에서 다룬 사이킷런 모델과 같습니다.

 

학습 과정을 통해서 목표값과 예측값의 오차가 가장 작은 함수 관계식을 찾습니다. 2개의 파라미터 값을 조금씩 변화를 주면서 최적화된 해를 찾는 것입니다. epochs=10은 이와 같은 학습 과정을 10번 반복한다는 뜻입니다. 로스(loss)값이 점점 줄어드는 것을 볼 수 있습니다. 학습이 잘 되고 있다는 뜻입니다.

 

>>> dnn.fit(x_new, y, epochs=10)

Epoch 1/10
1/1 [==============================] - 0s 2ms/step - loss: 122.3979
Epoch 2/10
1/1 [==============================] - 0s 878us/step - loss: 14.1135
Epoch 3/10
1/1 [==============================] - 0s 2ms/step - loss: 2.3010
Epoch 4/10
1/1 [==============================] - 0s 1ms/step - loss: 0.9857
Epoch 5/10
1/1 [==============================] - 0s 1ms/step - loss: 0.8137
Epoch 6/10
1/1 [==============================] - 0s 1ms/step - loss: 0.7672
Epoch 7/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7355
Epoch 8/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7064
Epoch 9/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6787
Epoch 10/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6520
<tensorflow.python.keras.callbacks.History at 0x7f237c5d90b8>

 

새로운 x 데이터에 대한 y값 예측하기

 

x_test 변수에 저장되어 있는 데이터를 모델에 주입합니다. predict 메소드를 사용합니다. x 변수 값을 입력받아서 y값을 예측하게 됩니다. 예측값을 변수 y_hat_dnn에 저장합니다. 결과값은 21, 23, 25, 27, 29이고, 앞에서 다룬 사이킷런 LinearRegression 모델의 예측결과와 일치합니다.

 

>>> y_hat_dnn = dnn.predict(x_test)
>>> y_hat_dnn

array([21., 23., 25., 27., 29.])

이전 포스팅(https://pydata.tistory.com/29)에 정리한 x_new 데이터와 y 데이터를 가지고, 머신러닝 알고리즘에게 학습을 시키는 과정을 보겠습니다. 일차함수 관계식을 가지고 만들었기 때문에, (x_new, y) 좌표에 점을 찍으면 직선 형태로 나타납니다. 이와 같이 두 변수 사이의 관계가 직선 형태를 갖는 경우 선형 관계에 있다고 말합니다.

 

 

필요한 라이브러리 불러오기

 

통계학에서는 선형회귀분석이라고 부르는데, 사이킷런(sklearn) 라이브러리는 선형회귀분석을 포함한 다양한 통계 툴을 지원합니다. LinearRegression 클래스 함수는 통계학의 선형회귀분석을 처리합니다.

>>> from sklearn.linear_model import LinearRegression

 

 

머신러닝 모델 객체 정의하기

 

LinearRegression 클래스 객체를 생성하고, 변수 lr에 저장합니다. LinearRegression 클래스 함수의 인수에 다양한 파라미터를 설정할 수 있습니다. 예를 들어, LinearRegression(fit_intercept=False, n_jobs=-1) 이라고 정의하면, 일차함수 식의 y절편인 b값을 계산하지 않습니다. n_jobs는 모델학습에 사용할 CPU 개수를 지정할 때 사용하는데, -1은 모든 CPU를 할당하여 사용한다는 뜻입니다. 2개의 CPU가 있는 컴퓨터에서 1개의 CPU만 사용하고 싶을 때는, n_jobs=1이라고 지정할 수 있습니다.

>>> lr = LinearRegression()

 

주어진 데이터로 모델 학습시키기

 

머신러닝 모델 객체를 만든 뒤에, 학습 데이터 x_new와 목표 값(정답) y를 모델에 주입하고 학습을 시킵니다. 이때 fit 메소드를 사용하는데, 실행을 하면 예측값의 오차가 가장 작은 함수 관계식을 찾게 됩니다. 기울기(a)는 2, y절편(b)는 -1로 거의 정확하게 관계식을 찾는데 성공했습니다.

>>> lr.fit(x_new, y)
>>> print ("기울기: ", lr.coef_)
>>> print ("y절편: ", lr.intercept_)

기울기: [2.]
y절편: -0.9999999999999996

 

새로운 x 데이터에 대한 y값 예측하기

 

전 단계에서 훈련을 마친 선형회귀 모델을 이용하여 새로운 데이터에 대한 목표값을 예측하겠습니다. 예측을 위한 새로운 데이터셋을 준비하고 x_test 변수에 저장합니다. 11~15 범위의 정수를 모델의 x 변수 입력 형태에 맞게 입력합니다.

>>> x_test = np.arange(11, 16, 1).reshape(-1, 1)
>>> x_test

array([[11],
[12],
[13],
[14],
[15]])

 

모델을 가지고 예측하는데 predict 메소드를 사용합니다. x 변수 값을 입력받아서 y값을 예측하게 됩니다. 예측값을 변수 y_hat에 저장합니다. 결과값은 21, 23, 25, 27, 29입니다.

>>> y_hat = lr.predict(x_test)
>>> y_hat

array([21., 23., 25., 27., 29.])

중학교 수학 시간에 일차함수를 배운 기억이 있을 거에요. y = ax + b (a는 직선의 기울기) 형태로 나타내는 일차함수를 x, y축에 그래프로 나타내면 일차적인 선형 관계를 나타내는 직선으로 표시됩니다.

일차함수 관계식을 알고 있다면, x값에 어떤 수를 대입하여 y값이 얼마인지 계산할 수 있습니다. 다시 말하면, 우리가 x값과 관계식을 알고 있는 상태에서 y값을 예측하는 것이 가능하다는 뜻입니다.

그렇다면, 머신러닝은 무엇일까요? 머신러닝은 기계(machine)가 학습(learning)한다는 뜻입니다. 컴퓨터는 일차함수 관계식을 알지 못하는 상태에서, x값과 대응되는 y값을 학습해서 두 변수 x, y 사이의 관계식을 찾습니다. x 변수의 값과 일차함수 관계식의 계수 a, b 위치에 다양한 후보값들을 대입하여 y 변수의 예측값을 계산합니다. y 예측값과 원래 y값의 오차가 가장 작을 때의 a, b 값을 찾아서, 일차함수 관계식인 y = ax + b를 완성합니다.

이처럼, 설명변수(x)와 목표변수(y)에 해당하는 데이터셋이 주어졌을 때 두 변수 사이의 관계식을 찾는 과정을 머신러닝에서 훈련(training)이라고 말합니다. 머신러닝을 이용하여 관계식을 찾고 나면, 새로운 데이터(x)에 대해서 목표값(y)을 찾을 수 있는데, 이 과정을 예측(prediction)이라고 합니다.

한편, 딥러닝은 머신러닝에 속하는 하위개념입니다. 딥러닝은 인간의 신경망을 본뜬 알고리즘을 사용하여 관계식을 찾는 머신러닝 방법이라고 생각하면 됩니다. 따라서, 학습하고 예측하는 과정은 머신러닝과 차이가 없습니다.

일차함수 관계식을 찾는 간단한 실습 예제를 통해서 머신러닝 개념을 이해합니다. 먼저, 데이터셋을 준비하는 과정부터 살펴 봅니다.

 

 

1. 먼저, x값 데이터를 만들겠습니다. -10부터 9까지 20개의 정수 배열을 만들고, 변수 x에 저장합니다.

 

import 명령을 사용하여 nupmy 라이브러리를 불러옵니다. "as np"는 numpy를 np라는 약칭으로 사용한다는 뜻입니다. arange 함수는 (범위 시작, 범위 끝, 숫자 간격) 순으로 인수를 입력받는데, 예제에서는 -10부터 10 사이의 숫자를 1 간격으로 생성합니다. 범위의 끝인 10은 제외되는 점에 유의합니다.

>>> import numpy as np
>>> x = np.arange(-10, 10, 1)
>>> x

array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

 

2. x값과 일차함수 관계를 갖는 y값 데이터를 만듭니다. (일차함수 y = 2x - 1 사용)

x는 원소 20개를 갖는 배열입니다. 배열에 연산기호(* , -)를 적용하면, 20개 원소 각각에 대하여 연산이 적용됩니다. x 배열의 원소에 2를 곱하고 1을 뺀 결과값의 배열을 순서대로 변수 y에 저장합니다.

>>> y = 2*x - 1
>>> y

array([-21, -19, -17, -15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15, 17])

 

3. x 배열, y 배열 값을 가지고 그래프를 그립니다.

matplotlib 라이브러리의 pyplot 모듈을 불러오는데, "as plt"는 plt라는 약칭을 사용한다는 뜻입니다. plot 메소드에 x, y 값을 순서대로 입력합니다.

>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y)

 

4. 순서대로 정렬되어 있는 x 배열 원소값들의 순서를 무작위로 바꾸는 작업을 합니다.

x.shape[0]은 x 배열의 크기(원소의 개수)를 나타내는데, 원소 개수는 20개입니다. 대신, len 함수를 사용하여 len(x)로 입력해도 같은 결과를 보입니다.

numpy의 arange 함수에 자연수(양의 정수)를 입력하면, 숫자 0부터 입력된 자연수 갯수만큼의 숫자 배열이 만들어집니다. 예제에서 x.shape[0]은 20이므로, idx 변수에는 0, 1, 2, ..., 19까지 20개의 정수 배열이 저장됩니다.

numpy의 random 모듈은 무작위 추출 작업을 하는데 이용합니다. shuffle 함수를 이용하여 배열의 인덱스(주소)를 나타내는 idx 배열의 순서를 랜덤하게 섞어 줍니다. idx 배열 자체의 순서가 변동되는 점에 유의합니다.

>>> print("x 배열의 원소 개수: ", x.shape[0])
>>> idx = np.arange(x.shape[0])
>>> print("기존 인덱스:", idx)
>>> np.random.shuffle(idx)
>>> print("섞인 인덱스:", idx)

x 배열의 원소 개수: 20
기존 인덱스: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
섞인 인덱스: [11 18 15 9 7 16 8 19 3 4 12 6 2 1 13 0 10 14 17 5]

x[idx]와 같이 x 배열에 새로운 인덱스 배열을 입력하면 x 배열의 순서가 변경됩니다. y 배열에도 같은 인덱스 배열을 입력하면 x 값에 매칭되는 y 값이 순서대로 위치를 찾게 됩니다.

>>> x = x[idx]
>>> print ("x: ", x)
>>> y = y[idx]
>>> print ("y: ", y)

x: [ -1 5 2 -9 -2 4 -6 9 3 -10 -3 -4 6 1 -5 7 8 -7 -8 0]
y: [ -3 9 3 -19 -5 7 -13 17 5 -21 -7 -9 11 1 -11 13 15 -15 -17 -1]

 

5. 1차원 형태의 x 배열을 2차원 형태로 변환합니다.

일반적으로, 머신러닝 알고리즘에서 x 변수의 데이터 값 배열은 가로 방향으로 긴 형태가 아니라 세로 방향으로 긴 형태로 만듭니다. 따라서, x 배열의 형태를 다음과 같이 세로 형태로 변환합니다. 2차원 배열에서 세로 방향의 각 열은 하나의 설명변수(x)에 속하는 데이터 값들의 모임이라고 볼 수 있습니다.

20개의 원소를 갖는 x 배열에 reshape 메소드를 적용하여 배열의 모양을 바꿀 수 있습니다. (-1, 1)에서 왼쪽의 숫자는 행의 개수를 나타내고, 오른쪽의 숫자는 열의 개수를 나타냅니다. 따라서, 열의 개수는 1개가 됩니다. 다만, -1은 정해진 개수를 나타내지 않고, 원래 배열의 개수인 20과 남은 차원(여기서는 열의 개수)인 1로 정해진다는 뜻입니다. 20개의 원소를 1개의 열에 넣으려면 행의 개수는 20개가 되어야 합니다. 결론적으로, 20개의 행과 1개의 열을 가진 2차원 구조로 변환됩니다.

>>> x_new = x.reshape(-1,1)
>>> x_new

array([[ -1],
[ 5],
[ 2],
[ -9],
[ -2],
[ 4],
[ -6],
[ 9],
[ 3],
[-10],
[ -3],
[ -4],
[ 6],
[ 1],
[ -5],
[ 7],
[ 8],
[ -7],
[ -8],
[ 0]])

이것으로 머신러닝(딥러닝) 알고리즘에 입력할 수 있는 데이터셋의 형태를 만들었습니다. 다음 게시글에서는 이 데이터셋을 이용하여 실제로 머신러닝 라이브러리를 통해 훈련-예측하는 과정을 살펴보겠습니다.

구글 코랩(Google Colaboratory)이란?

파이썬 딥러닝을 공부하려면 비싼 그래픽카드(GPU)가 탑재된 딥러닝 전용 PC와 여러가지 소프트웨어 등 높은 수준의 개발 환경이 필요합니다.

 

구글에서 제공하는 클라우드 환경에서 파이썬 프로그래밍을 하는 방법을 소개합니다. 파이썬을 데스크톱이나 노트북에 따로 설치하지 않아도 되고, 초보자들이 어려워하는 복잡한 소프트웨어 환경설정도 필요하지 않습니다.

구글 코랩(Google Colaboratory)는 웹브라우저에서 바로 실행 가능한 무료 코드 에디터입니다. 파이썬 사용자들에게 널리 알려진 Jupyter 노트북 환경을 기반으로 만들었고, 사용이 편리한 장점이 있습니다.

1. 구글 코랩은 설치가 필요 없습니다.

2. 인터넷이 접속되는 컴퓨터만 있으면 사용 가능합니다.

3. 무료입니다.

4. 파이썬, 머신러닝, 딥러닝에 필요한 툴이 지원됩니다. 

물론 단점(?)도 있습니다. 사용 시간이 12시간이 넘으면 세션이 종료됩니다. 그리고, 지원되는 메모리(RAM)과 저장 장치 디스크 용량에 제한이 있습니다. 하지만, 캐글이나 국내에서 진행되는 대부분의 데이터 분석 경진대회에서도 충분한 성능을 발휘하므로 걱정하실 필요는 없어요.

 

 

구글 코랩 실행 방법

1. 웹브라우저를 열고 구글 계정에 로그인합니다. 구글 검색창에 "Colab"이라고 검색어를 입력하면, 다음과 같이 Google Colab 페이지 링크가 보입니다.

 

2. Google Colab 링크를 클릭하면 코랩 사이트에 접속하고, 메인 페이지가 다음과 같이 나타납니다.

 

3. "Colabotory에 오신 것을 환영합니다" 링크를 클릭하면 코랩 소개 페이지가 실행됩니다. 대신에 오른쪽 아래 "새 노트"를 클릭하면 새로운 노트 파일이 만들어집니다.

 

이제 구글 코랩을 실행하는데 성공했습니다. 파이썬 주피터(Jupyter) 노트북 환경에 익숙한 분들은 따로 설명드리지 않아도 사용하는데 어려움이 없으실 거예요. 파이썬이 처음인 분들을 위한 설명은 다음 편에 계속 이어가겠습니다. 

+ Recent posts