728x90
반응형
IT World에 나온 기사입니다. 타이틀이 넘 마음에 들어 공유하고자 합니다.
과거 몇년전 한국에서 구글알파고 AI 와 인간(이세돌 9단)간 세기의 바둑대결이 이루어 졌던 해..(2016년으로 나오네요)
한국과 전세계는 초미의 관심을 가졌고...알파고의 사실 완벽한 승리였다고 생각되는 대국이었다.
알파고의 핵심은 학습능력을기반으로 스스로 해결책을 찾을 수 있다는 것이다. 더 많은 대국을 하면 할 수 록 인간은 AI기사인 알파고를 결코 이길 수 없을 것이라는 평가가 사실 지배적이었다.
머신러닝, 딥러닝이라는 용어가 세삼스럽지는 않을 것이고이러한기술이 앞으로 이 세상을 어떻게 변화시킬 지 생각해 보는 것도 나름 유익할 것 같다
[기사 본문]
머신러닝(Machine learning)과 딥러닝(deep learning)은 널리 알려진 익숙한 용어지만, 이런 유명세 만큼이나 더 폭넓은 오해를 받는 부분도 있다. 여기서는 한 걸음 물러서서 머신러닝과 딥러닝의 기본을 살펴보고, 가장 보편적인 몇 가지 머신러닝 알고리즘을 알아본다. 이런 알고리즘이 역사적 데이터로부터 예측 모델을 만들기 위한 퍼즐의 다른 조각과 어떻게 관련되는지도 설명한다.
ⓒ Getty Image Bank
선형 회귀 알고리즘은 직선, 또는 다항식과 같이 매개변수가 선형인 다른 함수를 수치 데이터에 맞추는데, 이를 위해 일반적으로 사용하는 방법은 선과 데이터 간의 제곱 오차를 최소화하기 위해 행렬 역변환을 수행하는 것이다. 제곱 오차를 척도로 사용하는 이유는 회귀선이 데이터 포인트 위에 있는지, 아래에 있는지는 중요하지 않기 때문이다. 중요한 것은 선과 포인트 간의 거리다.
매개변수가 선형이 아닌 곡선을 데이터에 맞추는 비선형 회귀 알고리즘은 조금 더 복잡하다. 선형 회귀 문제와 달리 결정론적 방법으로 해결할 수 없기 때문이다. 대신 비선형 회귀 알고리즘은 일종의 반복적 최소화 프로세스를 구현하는데, 이는 급속 하강(steepest descent) 방법의 변형인 경우가 많다.
급속 하강은 기본적으로 현재 매개변수 값에서 제곱 오차와 그 기울기를 계산하고, 단계 크기 즉, 학습률을 선택하고, 기울기 방향을 "아래로" 따라간 다음, 새로운 매개변수 값에서 제곱 오차와 그 기울기를 다시 계산한다. 운이 좋다면 최종적으로 이 과정은 수렴한다. 급속 하강에는 수렴 속성을 개선하고자 하는 여러 변형이 있다.
머신러닝 알고리즘은 비선형 회귀보다도 더 복잡한데, 머신러닝은 다항식과 같은 특정 수학 함수에 맞추는 제약이 없다는 점도 그 이유 중 하나다. 머신러닝이 해결하는 대표적인 두 가지 문제 범주는 회귀와 분류다. 회귀는 수치 데이터, 분류는 비수치 데이터에 사용된다. 전자는 특정 주소와 직업을 가진 사람의 예상 수입은 어느 정도인가와 같은 문제, 후자는 대출 신청자가 이 대출을 상환하지 않을 것인가와 같은 문제다. 예측 문제(“내일 마이크로소프트 주식의 시초가는 얼마가 될까?”)는 시계열 데이터에 대한 회귀 문제의 하위 집합이다. 분류 문제는 이진(예/아니요), 다중 범주 문제(동물, 채소 또는 광물)로 나뉘기도 한다.
비지도 학습에서는 알고리즘이 스스로 데이터를 살펴보고 유의미한 결과를 도출하려고 시도한다. 예를 들어 각 클러스터 내에서 연관될 수 있는 데이터 포인트의 클러스터 집합이 결과로 나올 수 있다. 클러스터가 겹치지 않을 때 더 효과적으로 작동한다.
학습과 평가를 통해 매개변수를 최적화해 데이터의 기준 진실과 가장 잘 일치하는 값 집합을 찾음으로써 지도 학습 알고리즘을 모델로 바꾼다. 알고리즘은 옵타마이저를 위해 예를 들어 확률적 경사 하강(SGD: 무작위 시작점에서 여러 번 수행되는 급속 하강이라고 할 수 있음)과 같은 급속 하강의 변형에 의존하는 경우가 많다. SGD의 일반적인 개선 방법은 운동량을 기반으로 경사의 방향을 수정하거나, 한 데이터 패스(에포크라고 함)에서 다음 패스로의 진행에 따라 학습률을 조정하는 요소를 추가하는 것이다.
그 외에도 할 수 있는 일이 많지만 이는 수집된 데이터에 따라 달라진다. 지루한 작업일 수 있으나 머신러닝 파이프라인에 데이터 정제 단계를 두면 자유롭게 수정하고 반복할 수 있다.
첫째는 레이블 인코딩으로, 각 텍스트 레이블이 숫자로 대체된다. 둘째는 원핫(one-hot) 인코딩으로, 각 텍스트 레이블 값이 이진 값(1 또는 0)이 있는 열로 변환된다. 대부분의 머신러닝 프레임워크에는 이 같은 변환을 수행하는 함수가 있다. 레이블 인코딩의 경우 머신러닝 알고리즘이 혼동해서 인코딩된 열이 정렬된 것으로 착각할 수 있으므로 일반적으로 원핫 인코딩이 선호된다.
머신 회귀에 숫자 데이터를 사용하려면 일반적으로 데이터를 정규화해야 한다. 그렇지 않으면 범위가 큰 숫자가 특징 벡터 간의 유클리드 거리를 지배하는 경향이 있고, 이들의 효과가 확대되면서 다른 필드가 희생되고 급속 하강 최적화가 잘 수렴되지 않을 수 있다. ML을 위해 데이터를 정규화 및 표준화하는 방법은 최소-최대 정규화, 평균 정규화, 표준화, 단위 길이로 스케일링 등 여러 가지가 있다. 이 프로세스를 보통 특징 스케일링(feature scaling)이라고 한다.
특징을 선택하는 기법 중 하나는 문제를 설명하는 최소 독립 변수 집합을 선택하는 것이다. 두 변수가 고도로 상호 연관된다면 하나의 특징으로 결합해야 하거나 하나를 삭제해야 한다. 주성분 분석을 수행하여 상호 연관된 여러 변수를 선형적으로 상호 연관되지 않은 변수들의 집합으로 변환하는 경우도 종종 있다.
새로운 특징을 구축하거나 특징 벡터의 차원을 축소하기 위해 사용하는 변환 방법 중에서 간단한 방법도 몇 가지 있다. 예를 들어 Year of Death에서 Year of Birth를 빼면 수명 및 사망 분석을 위한 주요 독립 변수인 Age at Death를 구축할 수 있다. 특징 구축이 명확하지 않은 경우도 있다.
흔히 듣는 신경망과 심층 신경망은 어디에 있을까? 이 둘은 대체로 계산 집약적이라서 GPU 또는 다른 특수한 하드웨어가 필요하므로 비교적 단순한 알고리즘에는 맞지 않는 이미지 분류, 음성 인식과 같은 특수한 문제에만 사용해야 한다. 위에서 “심층”은 신경망 안에 숨은 계층이 많다는 것을 의미한다. 신경망과 심층 신경망에 대한 더 자세한 내용은 “딥러닝의 진정한 의미”를 참고하면 된다.
많은 경우 가장 중요한 초매개변수는 학습률이다. 학습률은 최적화에서 다음에 시도할 가중치 집합을 찾을 때 사용되는 단계 크기를 결정한다. 학습률이 너무 높으면 경사 하강이 평지(plateau) 또는 비최적 지점에 빠르게 수렴할 수 있고, 학습률이 너무 낮으면 경사 하강이 정체되어 완전히 수렴하지 않을 수 있다.
다른 많은 일반적인 초매개변수는 사용되는 알고리즘에 따라 달라진다. 대부분 알고리즘에는 최대 에포크 수, 또는 최대 실행 시간, 에포크 간 최소 개선과 같은 중지 매개변수가 있다. 특정 알고리즘에는 검색의 형태를 제어하는 초매개변수가 있다. 예를 들어 랜덤 포레스트에는 리프당 최소 샘플 수, 최대 깊이, 분할 시 최소 샘플 수, 리프의 최소 가중치 비율, 그 외에 8가지에 대한 초매개변수가 있다.
최대한 많은 초매개변수를 튜닝해야 최선의 답을 얻는다고 생각할 수 있다. 그러나 개인 하드웨어에서 실행하는 경우가 아닌 한 비용이 상당히 커질 수 있고, 어떤 경우든 얻는 이득은 점점 줄어든다. 자신의 데이터와 선택한 알고리즘에서 가장 중요한 초매개변수는 경험을 통해 발견할 수 있다.
모든 것을 수동으로 시도한다는 것은 비현실적이므로, 당연히 머신러닝 툴 제공업체들은 많은 노력을 기울여 오토ML(AutoML) 시스템을 출시했다. 우수한 시스템은 특징 공학과 알고리즘 및 정규화에 대한 스윕을 결합한다. 최선의 모델에 대한 초매개변수 튜닝은 나중을 위해 남겨두는 경우가 많다. 다만 특징 공학은 자동화하기 어려운 문제이며 이 부분을 다루지 않는 오토ML 시스템도 있다.
요약하자면, 머신러닝 알고리즘은 머신러닝 퍼즐의 한 조각일 뿐이다. 알고리즘 선택(수동 또는 자동) 외에도 옵티마이저, 데이터 정제, 특징 선택, 특징 정규화, 그리고 선택적으로 초매개변수 튜닝까지 처리해야 한다. 이 모든 부분을 처리하고 데이터에 맞는 모델을 구축했다면, 이제 모델을 배포하고 조건의 변화에 따라 업데이트할 차례다. 프로덕션의 머신러닝 모델을 관리하는 것은 또 다른 문제다.
editor@itworld.co.kr
ⓒ Getty Image Bank
머신러닝 알고리즘이란
머신러닝은 데이터로부터 자동으로 모델을 생성하는 방법이고, 머신러닝 알고리즘은 머신러닝을 움직이는 엔진이다. 즉, 데이터 집합을 모델로 바꿔주는 알고리즘이다. 지도, 비지도, 분류, 회귀 등 어떤 알고리즘이 가장 효과적인지는 해결하려는 문제의 종류, 가용한 컴퓨팅 리소스, 데이터의 속성에 따라 달라진다.머신러닝의 작동 원리
일반적인 프로그래밍 알고리즘은 컴퓨터에 해야 할 일을 간단한 방식으로 알려준다. 예를 들어 정렬 알고리즘은 정렬되지 않은 데이터를 데이터에 있는 하나 이상 필드의 숫자 또는 알파벳 순서 등 특정 기준에 따라 정렬된 데이터로 변환한다.선형 회귀 알고리즘은 직선, 또는 다항식과 같이 매개변수가 선형인 다른 함수를 수치 데이터에 맞추는데, 이를 위해 일반적으로 사용하는 방법은 선과 데이터 간의 제곱 오차를 최소화하기 위해 행렬 역변환을 수행하는 것이다. 제곱 오차를 척도로 사용하는 이유는 회귀선이 데이터 포인트 위에 있는지, 아래에 있는지는 중요하지 않기 때문이다. 중요한 것은 선과 포인트 간의 거리다.
매개변수가 선형이 아닌 곡선을 데이터에 맞추는 비선형 회귀 알고리즘은 조금 더 복잡하다. 선형 회귀 문제와 달리 결정론적 방법으로 해결할 수 없기 때문이다. 대신 비선형 회귀 알고리즘은 일종의 반복적 최소화 프로세스를 구현하는데, 이는 급속 하강(steepest descent) 방법의 변형인 경우가 많다.
급속 하강은 기본적으로 현재 매개변수 값에서 제곱 오차와 그 기울기를 계산하고, 단계 크기 즉, 학습률을 선택하고, 기울기 방향을 "아래로" 따라간 다음, 새로운 매개변수 값에서 제곱 오차와 그 기울기를 다시 계산한다. 운이 좋다면 최종적으로 이 과정은 수렴한다. 급속 하강에는 수렴 속성을 개선하고자 하는 여러 변형이 있다.
머신러닝 알고리즘은 비선형 회귀보다도 더 복잡한데, 머신러닝은 다항식과 같은 특정 수학 함수에 맞추는 제약이 없다는 점도 그 이유 중 하나다. 머신러닝이 해결하는 대표적인 두 가지 문제 범주는 회귀와 분류다. 회귀는 수치 데이터, 분류는 비수치 데이터에 사용된다. 전자는 특정 주소와 직업을 가진 사람의 예상 수입은 어느 정도인가와 같은 문제, 후자는 대출 신청자가 이 대출을 상환하지 않을 것인가와 같은 문제다. 예측 문제(“내일 마이크로소프트 주식의 시초가는 얼마가 될까?”)는 시계열 데이터에 대한 회귀 문제의 하위 집합이다. 분류 문제는 이진(예/아니요), 다중 범주 문제(동물, 채소 또는 광물)로 나뉘기도 한다.
지도 학습 vs. 비지도 학습
이러한 구분과 별개로 머신러닝 알고리즘에는 지도와 비지도, 2가지 종류가 있다. 지도 학습에서는 동물 이름이 딸린 일련의 동물 사진과 같은, 답변이 포함된 학습 데이터 집합을 제공한다. 이 학습의 목표는 이전에 본 적이 없는 사진을 올바르게 식별(학습 집합에 포함된 동물의 종류)할 수 있는 모델을 만드는 것이다.비지도 학습에서는 알고리즘이 스스로 데이터를 살펴보고 유의미한 결과를 도출하려고 시도한다. 예를 들어 각 클러스터 내에서 연관될 수 있는 데이터 포인트의 클러스터 집합이 결과로 나올 수 있다. 클러스터가 겹치지 않을 때 더 효과적으로 작동한다.
학습과 평가를 통해 매개변수를 최적화해 데이터의 기준 진실과 가장 잘 일치하는 값 집합을 찾음으로써 지도 학습 알고리즘을 모델로 바꾼다. 알고리즘은 옵타마이저를 위해 예를 들어 확률적 경사 하강(SGD: 무작위 시작점에서 여러 번 수행되는 급속 하강이라고 할 수 있음)과 같은 급속 하강의 변형에 의존하는 경우가 많다. SGD의 일반적인 개선 방법은 운동량을 기반으로 경사의 방향을 수정하거나, 한 데이터 패스(에포크라고 함)에서 다음 패스로의 진행에 따라 학습률을 조정하는 요소를 추가하는 것이다.
머신러닝을 위한 데이터 정제
자연 상태에서 깨끗한 데이터는 존재하지 않는다. 머신러닝에 사용하려면 데이터를 적극적으로 필터링해야 한다. 예를 들면 다음과 같다.- 데이터를 살펴보고 누락된 데이터가 많은 열을 제외한다.
- 데이터를 다시 살펴보면서 예측에 사용할 열을 선택한다. 이 열은 반복할 때 바꾸는 경우가 많다.
- 나머지 열에서 여전히 누락된 데이터가 있는 행을 제외한다.
- 명백한 오타를 교정하고 동일한 답변을 병합한다. 예를 들어 U.S. US. USA, 미국은 하나의 범주로 병합해야 한다.
- 범위를 벗어난 데이터가 있는 행을 제외한다. 예를 들어 뉴욕시 내의 택시 이동을 분석한다면 뉴욕시 경계 상자를 벗어난 승하차 위도 및 경도는 필터링으로 걸러낸다.
그 외에도 할 수 있는 일이 많지만 이는 수집된 데이터에 따라 달라진다. 지루한 작업일 수 있으나 머신러닝 파이프라인에 데이터 정제 단계를 두면 자유롭게 수정하고 반복할 수 있다.
머신러닝을 위한 데이터 인코딩 및 정규화
머신 분류를 위해 범주 데이터를 사용하려면 텍스트 레이블을 다른 양식으로 인코딩해야 한다. 일반적으로 2가지 인코딩이 사용된다.첫째는 레이블 인코딩으로, 각 텍스트 레이블이 숫자로 대체된다. 둘째는 원핫(one-hot) 인코딩으로, 각 텍스트 레이블 값이 이진 값(1 또는 0)이 있는 열로 변환된다. 대부분의 머신러닝 프레임워크에는 이 같은 변환을 수행하는 함수가 있다. 레이블 인코딩의 경우 머신러닝 알고리즘이 혼동해서 인코딩된 열이 정렬된 것으로 착각할 수 있으므로 일반적으로 원핫 인코딩이 선호된다.
머신 회귀에 숫자 데이터를 사용하려면 일반적으로 데이터를 정규화해야 한다. 그렇지 않으면 범위가 큰 숫자가 특징 벡터 간의 유클리드 거리를 지배하는 경향이 있고, 이들의 효과가 확대되면서 다른 필드가 희생되고 급속 하강 최적화가 잘 수렴되지 않을 수 있다. ML을 위해 데이터를 정규화 및 표준화하는 방법은 최소-최대 정규화, 평균 정규화, 표준화, 단위 길이로 스케일링 등 여러 가지가 있다. 이 프로세스를 보통 특징 스케일링(feature scaling)이라고 한다.
머신러닝 특징
앞에서 언급한 특징(feature) 벡터가 무엇인지 알아보자. 우선, 특징이란 관찰 대상 현상의 측정 가능한 개별적인 속성 또는 특성이다. “특징”이라는 개념은 선형 회귀와 같은 통계 기법에서 사용되는 설명 변수와 관계가 있다. 특징 벡터는 한 행의 모든 특징을 하나의 숫자 벡터로 결합한다.특징을 선택하는 기법 중 하나는 문제를 설명하는 최소 독립 변수 집합을 선택하는 것이다. 두 변수가 고도로 상호 연관된다면 하나의 특징으로 결합해야 하거나 하나를 삭제해야 한다. 주성분 분석을 수행하여 상호 연관된 여러 변수를 선형적으로 상호 연관되지 않은 변수들의 집합으로 변환하는 경우도 종종 있다.
새로운 특징을 구축하거나 특징 벡터의 차원을 축소하기 위해 사용하는 변환 방법 중에서 간단한 방법도 몇 가지 있다. 예를 들어 Year of Death에서 Year of Birth를 빼면 수명 및 사망 분석을 위한 주요 독립 변수인 Age at Death를 구축할 수 있다. 특징 구축이 명확하지 않은 경우도 있다.
일반적인 머신러닝 알고리즘
머신러닝 알고리즘은 선형 회귀와 로지스틱 회귀부터 심층 신경망 및 앙상블(다른 모델의 조합)에 이르기까지 수십 가지가 있지만 가장 일반적인 알고리즘은 다음과 같다.- 선형 회귀 또는 최소 제곱 회귀(숫자 데이터)
- 로지스틱 회귀(이진 분류)
- 선형 판별 분석(다중 범주 분류)
- 결정 트리(분류와 회귀)
- 나이브 베이즈(분류와 회귀)
- K-최근접 이웃(KNN, 분류와 회귀)
- 학습 벡터 양자화(LVQ, 분류와 회귀)
- 서포트 벡터 머신(SVM, 이진 분류)
- 랜덤 포레스트, “배깅” 앙상블 알고리즘의 한 유형(분류와 회귀)
- 부스팅 방법(AdaBoost 및 XGBoost 포함)은 일련의 모델을 생성하는 앙상블 알고리즘으로, 각각의 새로운 모델이 이전 모델의 오류를 수정하려고 시도
흔히 듣는 신경망과 심층 신경망은 어디에 있을까? 이 둘은 대체로 계산 집약적이라서 GPU 또는 다른 특수한 하드웨어가 필요하므로 비교적 단순한 알고리즘에는 맞지 않는 이미지 분류, 음성 인식과 같은 특수한 문제에만 사용해야 한다. 위에서 “심층”은 신경망 안에 숨은 계층이 많다는 것을 의미한다. 신경망과 심층 신경망에 대한 더 자세한 내용은 “딥러닝의 진정한 의미”를 참고하면 된다.
머신러닝 알고리즘의 초매개변수
머신러닝 알고리즘은 데이터로 학습해서 예측된 값 또는 클래스에 영향을 미치는 각 독립 변수에 대한 최적의 가중치 집합을 찾는다. 알고리즘 자체에는 초매개변수(hyperparameters)라는 변수가 있다. 결정되는 가중치가 아니라 알고리즘의 작동을 제어하기 때문에 매개변수가 아닌 초매개변수로 불린다.많은 경우 가장 중요한 초매개변수는 학습률이다. 학습률은 최적화에서 다음에 시도할 가중치 집합을 찾을 때 사용되는 단계 크기를 결정한다. 학습률이 너무 높으면 경사 하강이 평지(plateau) 또는 비최적 지점에 빠르게 수렴할 수 있고, 학습률이 너무 낮으면 경사 하강이 정체되어 완전히 수렴하지 않을 수 있다.
다른 많은 일반적인 초매개변수는 사용되는 알고리즘에 따라 달라진다. 대부분 알고리즘에는 최대 에포크 수, 또는 최대 실행 시간, 에포크 간 최소 개선과 같은 중지 매개변수가 있다. 특정 알고리즘에는 검색의 형태를 제어하는 초매개변수가 있다. 예를 들어 랜덤 포레스트에는 리프당 최소 샘플 수, 최대 깊이, 분할 시 최소 샘플 수, 리프의 최소 가중치 비율, 그 외에 8가지에 대한 초매개변수가 있다.
초매개변수 튜닝
여러 프로덕션 머신러닝 플랫폼이 현재 자동 초매개변수 튜닝을 제공한다. 기본적으로 시스템에 변경할 초매개변수와 최적화하고자 하는 메트릭을 알려주면 시스템은 허용되는 만큼 많은 실행 횟수에 걸쳐 이러한 초매개변수를 스윕한다. 단, 구글 클라우드 초매개변수 튜닝은 텐서플로우 모델에서 적절한 메트릭을 추출하므로 직접 지정할 필요가 없다. 초매개변수 스위핑을 위한 검색 알고리즘에는 베이지안(Bayesian) 최적화, 그리드(grid) 검색, 무작위 검색의 3가지가 있다. 베이지안 최적화가 대체로 가장 효율적이다.최대한 많은 초매개변수를 튜닝해야 최선의 답을 얻는다고 생각할 수 있다. 그러나 개인 하드웨어에서 실행하는 경우가 아닌 한 비용이 상당히 커질 수 있고, 어떤 경우든 얻는 이득은 점점 줄어든다. 자신의 데이터와 선택한 알고리즘에서 가장 중요한 초매개변수는 경험을 통해 발견할 수 있다.
자동 머신러닝
알고리즘 선택에 대해 말하자면, 어느 알고리즘 또는 알고리즘 앙상블이 현재 데이터에 맞는 최선의 모델을 제공할지 아는 방법은 하나밖에 없다. 모두 시도해 보는 것이다. 여기서 가능한 모든 정규화 및 특징 선택까지 시도한다면 조합의 수는 폭발적으로 증가한다.모든 것을 수동으로 시도한다는 것은 비현실적이므로, 당연히 머신러닝 툴 제공업체들은 많은 노력을 기울여 오토ML(AutoML) 시스템을 출시했다. 우수한 시스템은 특징 공학과 알고리즘 및 정규화에 대한 스윕을 결합한다. 최선의 모델에 대한 초매개변수 튜닝은 나중을 위해 남겨두는 경우가 많다. 다만 특징 공학은 자동화하기 어려운 문제이며 이 부분을 다루지 않는 오토ML 시스템도 있다.
요약하자면, 머신러닝 알고리즘은 머신러닝 퍼즐의 한 조각일 뿐이다. 알고리즘 선택(수동 또는 자동) 외에도 옵티마이저, 데이터 정제, 특징 선택, 특징 정규화, 그리고 선택적으로 초매개변수 튜닝까지 처리해야 한다. 이 모든 부분을 처리하고 데이터에 맞는 모델을 구축했다면, 이제 모델을 배포하고 조건의 변화에 따라 업데이트할 차례다. 프로덕션의 머신러닝 모델을 관리하는 것은 또 다른 문제다.
editor@itworld.co.kr
728x90
반응형
'시장 및 산업 동향' 카테고리의 다른 글
가트너 “기업 55%, 새 애플리케이션 개발에 AI 우선 전략 채택” (2) | 2023.08.03 |
---|---|
맥킨지 “기업 22% 생성형 AI 활용··· 기술, 금융, 제약 분야 등에 도입 증가” (0) | 2023.08.03 |
SW 개발 ‘속도’ 집착이 모든 것을 망치고 있다 (1) | 2023.07.13 |
‘외주와 혁신 사이’··· IT 아웃소싱 딜레마 해결 법 (0) | 2023.07.13 |
IT 리더가 이사회 회의에서 흔히 저지르는 실수 5가지 (0) | 2023.07.13 |