范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

强化学习(reinforcementlearning)(一)

  作为棋盘游戏,围棋已有2000多年的历史。长期以来,它一直被认为是美与艺术的创造,因为其规则很简单,但对弈非常复杂,并且曾认为在未来几十年中能经受住人工智能的挑战。然而,当时间来到2016年3月9日至15日,在韩国首尔进行的韩国围棋九段棋手李世石与人工智能围棋程序阿尔法围棋AlphaGo之间的五番棋比赛,AlphaGo以4-1战胜了这位世界顶级围棋棋手,这是人工智能里程碑式的成就。
  AlphaGo是使用基于数百万人类专家游戏的训练数据集以及其他资源进行监督学习的。AlphaGo的下一个迭代版本AlphaGo Zero,完全跳过了这种方法,仅依靠强化学习和自我对弈,将不同代且训练有素的基于神经网络的人工智能体放在一起相互竞争。Silver等人在其2017年发表的文章中介绍了AlphaGo Zero的详细信息。在摘要中, 研究人员总结道:
  AlphaGo成了自己的老师:训练神经网络来预测自己的走法选择以及游戏的获胜者。该神经网络提高了树搜索的强度,从而能在下一次迭代中产生更高质量的走 法选择和更强的自我对弈。从一无所知开始,新程序 AlphaGo Zero 取得了超人的表现,以100–0战胜了之前发布的击败了李世石的AlphaGo。
  由此可见,在行动策略中将强化学习与神经网络相结合的优越性。下面我们来简单学习下"强化学习"。
  基本概念环境
  环境定义了当前的问题,可以是要玩的计算机游戏或要进行交易的金融市场。 状态
  状态包含描述环境当前状态的所有相关参数。在计算机游戏中,这可能是整个屏幕及其 像素。在金融市场中,这可能包括当前和历史价格水平或金融指标,比如移动平均线、 宏观经济变量等。 智能体
  智能体这个词包含了与环境交互并从这些交互中学习的强化学习算法的所有元素。在游 戏环境中,智能体可能代表玩游戏的玩家。在金融环境中,智能体可以代表在市场中进 行交易的交易者。 动作
  智能体可以从一组(有限的)被允许的动作中选择一个动作。在计算机游戏中,被允许 的动作可能是向左或向右移动,而在金融市场中,被允许的动作可能是做多或做空。 步骤
  给定智能体的动作,环境状态会被更新,这样的更新通常被称为一个步骤。步骤的概念 可以包含两个步骤之间的相同或者不同的时间间隔。虽然在计算机游戏中,与游戏环境 的实时交互是通过相当短且相同的时间间隔("游戏时钟")来模拟的,但诸如与金融市 场环境交互的交易机器人则可以在更长且不同的时间间隔内采取动作。 奖励
  根据智能体选择的动作,对其实行奖励(或惩罚)。对于计算机游戏,积分是一种典型 的奖励。在金融环境中,利润(或亏损)是一种标准的奖励(或惩罚)。 目标
  目标是指智能体试图最大化的内容。在计算机游戏中,这通常是智能体达到的分数。对 于金融交易机器人,这可能是累积的交易利润。 策略
  策略定义了智能体在给定环境状态下所采取的动作。给定计算机游戏的特定状态(由构 成当前场景的所有像素表示),策略可能会指定智能体选择"向右移动"作为动作。观 察到连续 3 个价格上涨的交易机器人可能会根据其策略决定做空市场。 回合
  回合是从环境的初始状态到成功或可预见的失败的一组步骤。在游戏中,这是从游戏开 始到输或赢为止。以金融界为例,这就是从年初到年底,或者到破产。
  接下来我们在实例中逐步说明上述概念。
  OpenAI Gym
  OpenAI是一个致力于促进人工智能研究,特别是强化学习研究的组织。 OpenAI开发并开源了一套环境,称为 OpenAI Gym,允许通过标准化API训练RL智能体。在众多环境中,有模拟经典强化学习问题的CartPole环境(或游戏),即把一根杆子直立在推车上,目的是通过左右移动推车来学习平衡杆子的策略。环境状态由4个参数表示, 包括以下物理测量值:推车位置、推车速度、极角和极角速度(尖端)。图1描述了一个可视化的环境。
  图1 OpenAI Gym的CartPole环境
  以下代码实例化CartPole的环境对象,观察空间是环境状态的模型。 env = gym.make("CartPole-v1", render_mode="rgb_array") env.action_space.seed(100)  # 初始状态:推车位置、推车速度、极角和极角速度 state, _ = env.reset() state # Out: # array([ 0.0438, -0.0123,  0.0364, -0.0128], dtype=float32)
  只要 done=False,智能体就还在游戏中,并且可以选择另一个动作。当智能体达到总计500步(CartPole-v0版本是200步)或总奖励达到500(每步奖励 1.0)时,即取得成功。当推车上的杆子到达一定角度导致杆子从推车上掉下来时,故障被观测到,在这种情况下,返回done=True。简单智能体是遵循完全随机策略的智能体:无论观察到什么状态,智能体都会选择一个随机动作,如下面的代码实现所示。在这种情况下,智能体可以走的步数仅取决于它的幸运程度,其并未以更新策略的形式进行学习。 env.reset() for e in range(500):     # 随机动作策略     a = env.action_space.sample()     # 向前一步     state, reward, done, truncated, info = env.step(a)     print(f"step={e:2d} | state={state} | action={a} | reward={reward}")     # 少于200步则失败     if done and (e + 1) < 200:         print("*** FAILED ***")         break # Out: # step= 1 | state=[ 0.0096 -0.1469 -0.0307  0.2928] | action=0 | reward=1.0 # step= 2 | state=[ 0.0066 -0.3415 -0.0249  0.5757] | action=0 | reward=1.0 # step= 3 | state=[-0.0002 -0.5363 -0.0133  0.8604] | action=0 | reward=1.0 # step= 4 | state=[-0.0109 -0.7312  0.0039  1.1489] | action=0 | reward=1.0 # step= 5 | state=[-0.0255 -0.9264  0.0268  1.4428] | action=0 | reward=1.0 # step= 6 | state=[-0.0441 -1.1218  0.0557  1.7437] | action=0 | reward=1.0 # step= 7 | state=[-0.0665 -1.3175  0.0906  2.0532] | action=0 | reward=1.0 # step= 8 | state=[-0.0928 -1.5135  0.1316  2.3725] | action=0 | reward=1.0 # step= 9 | state=[-0.1231 -1.7095  0.1791  2.7025] | action=0 | reward=1.0 # step=10 | state=[-0.1573 -1.9054  0.2331  3.0441] | action=0 | reward=1.0 # *** FAILED ***  done # Out: # True
  在监督学习中,假设训练数据集、验证数据集和测试数据集在训练开始之前已经存在,而在强化学习中,智能体通过与环境交互来生成自己的数据。在许多情况下(比如在游戏中),这是一个巨大的简化。考虑一下国际象棋游戏:一个 RL智能体可以通过与另一个国际象棋引擎或另一个版本的自身对战,而不是将数千个人类历史上所生成的国际象棋棋谱加载到计算机中。 蒙特卡罗智能体
  CartPole问题不一定非要使用成熟的强化学习方法和一些神经网络来解决,下面是基于蒙特卡罗模拟的简单解决方案,并使用降维的特定策略。在这种情况下,定义环境状态的4个参数通过线性组合被压缩为了单个实值参数。 np.random.seed(100) weights = np.random.random(4) * 2 - 1 # weights print(f"weights: {weights}")  # 环境的初始状态 state, _ = env.reset() print(f"state: {state}")  # 状态和权重的点积 s = np.dot(state, weights) print(f"s: {s}") # Out: # weights: [ 0.0868 -0.4433 -0.151   0.6896] # state: [-0.0465 -0.0319 -0.0016 -0.0308] # s: -0.010908021653158767
  接下来可以使用此策略玩一回合CartPole游戏。鉴于所应用的权重的随机性,通常结果并不比上一节的随机动作策略的结果好。 def run_episode(env, weights):     state = env.reset()[0]     treward = 0     for _ in range(500):         s = np.dot(state, weights)         # 根据单个状态参数s的符号来选择策略         a = 0 if s < 0 else 1         state, reward, done, truncated, info = env.step(a)         treward += reward         if done:             break     return treward # run_episode(env, weights)
  因此,可以应用蒙特卡罗模拟来测试大量不同的权重,检查它们是成功还是失败,然后选择产生成功的权重。 def set_seeds(seed=100):     random.seed(seed)     np.random.seed(seed)  set_seeds() num_episodes = 1000 besttreward = 0 for e in range(1, num_episodes + 1):     # 随机权重     weights = np.random.rand(4) * 2 - 1     # 这些权重的总奖励     treward = run_episode(env, weights)     # 观察是否有改善     if treward > besttreward:         # 替换最佳总奖励         besttreward = treward         # 替换最佳权重         bestweights = weights         if treward == 200:             print(f"SUCCESS | episode={e}")             break         print(f"UPDATE  | episode={e}") # Out: # UPDATE  | episode=1 # UPDATE  | episode=2 # UPDATE  | episode=13 # UPDATE  | episode=35
  如果连续 100 回合的平均总奖励为195或更高,则认为CartPole问题已被智能体解决,如以下代码所示。 res = [] for _ in range(100):     treward = run_episode(env, bestweights)     res.append(treward) res[:10] # Out: # [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0]
  这是一个用来与其他更复杂的方法做比较的强有力的基准。 神经网络智能体
  CartPole游戏也可以被转换为一个分类问题:环境状态由4个特征值组成,对应每组给定特征值的正确操作是需要预测的标签。通过与环境交互,神经网络智能体可以收集由特征值和标签组合组成的数据集。给定这个不断增长的数据集,可以训练神经网络来学 习给定环境状态的正确动作。在这种情况下,神经网络代表策略,智能体会根据新体验更新策略。
  首先是一些库的引用。 import tensorflow as tf from keras.layers import Dense, Dropout from keras.models import Sequential from keras.optimizers import adam_v2, rmsprop_v2 from sklearn.metrics import accuracy_score  def set_seeds(seed=100):     random.seed(seed)     np.random.seed(seed)     tf.random.set_seed(seed)     env.action_space.seed(100)
  然后是一个NNAgent类,它结合了智能体的主要元素:策略的神经网络模型、根据策略选择动作、更新策略(训练神经网络),以及多个回合的学习过程本身。智能体同时使用探索和利用来选择一个动作。探索是指随机动作,独立于当前策略。利用是指从当前策略派生的动作。这么做是因为某种程度的探索可以确保获得更丰富的经验,从而使智能体的学习得到改善。 class NNAgent:     def __init__(self):         # 最高总奖励         self.max = 0         self.scores = list()         self.memory = list()         self.model = self._build_model()      # 策略的 DNN 分类模型     def _build_model(self):         model = Sequential()         model.add(Dense(24, input_dim=4,                         activation="relu"))         model.add(Dense(1, activation="sigmoid"))         model.compile(loss="binary_crossentropy", optimizer=rmsprop_v2.RMSprop(learning_rate=0.001))         return model          # 选择动作的方法(探索和利用)     def act(self, state):         if random.random() <= 0.5:             return env.action_space.sample()         action = np.where(self.model.predict(             state, batch_size=None)[0, 0] > 0.5, 1, 0)         return action          # 更新策略的方法(训练神经网络)     def train_model(self, state, action):         self.model.fit(state, np.array([action,]),                        epochs=1, verbose=False)      # 从与环境的交互中学习的方法     def learn(self, episodes):         for e in range(1, episodes + 1):             state = env.reset()[0]             for _ in range(500):                 state = np.reshape(state, [1, 4])                 action = self.act(state)                 next_state, reward, done, truncated, info = env.step(action)                 if done:                     score = _ + 1                     self.scores.append(score)                     self.max = max(score, self.max)                     print("episode: {:4d}/{} | score: {:3d} | max: {:3d}"                           .format(e, episodes, score, self.max), end="r")                     break                 self.memory.append((state, action))                 self.train_model(state, action)                 state = next_state
  神经网络智能体没有解决上述配置下的问题,最大总奖励甚至一次也没有达到200。 set_seeds(100) agent = NNAgent() episodes = 500 agent.learn(episodes) # Out: # episode:  500/500 | score:  12 | max:  45  # 所有回合的平均总奖励 sum(agent.scores) / len(agent.scores) # Out: # 13.89
  这种方法似乎缺少一些东西,而其中一个主要的缺失元素是超越当前状态和要选择的动作的想法。目前为止所实现的方法无论如何都没有考虑到只有当智能体连续存活200步时才 能取得成功。简单地说,智能体会避免采取错误的动作,但没有学会赢得比赛。
  分析收集到的状态(特征)和动作(标签)的历史数据表明,神经网络的准确率达到了75%左右。然而,这并没有转化为之前看到的获胜策略。 # 所有回合的特征(状态) f = np.array([m[0][0] for m in agent.memory])  # 所有回合的标签(动作) l = np.array([m[1] for m in agent.memory]) accuracy_score(np.where(agent.model.predict(f) > 0.5, 1, 0), l) # Out: # 0.7453840186190845DQL智能体
  Q学习是一种强化学习算法,除了会考虑来自动作的即时奖励,还会考虑延迟奖励。该算法归功于Watkins(1989)以及Watkins 和 Dayan(1992),并在 Sutton 和 Barto(2018)的第6章中有详细解释。Q学习解决了神经网络智能体遇到的超越下一个立即奖励的问题。
  该算法的工作原理大致如下:有一个动作–价值策略Q,它为每个状态和动作的组合分配一个值。值越高,从智能体的角度来看动作越好。如果智能体使用策略Q选择一个动作, 则它会选择具有最高值的动作。
  那么一个动作的价值是如何得出的呢?一个动作的价值由它的直接奖励和下一状态下最优动作的折现值组成,以下是正式表达。
  这里,  是步骤(时间)t的状态,   是状态  采取的动作,  是动作  的直接奖励, 是折扣因子,   是给定当前策略 Q 的最优动作下的最大延迟奖励。 a在一个只有有限数量的可能状态的简单环境中,Q 可以用一张表格表示,其中列出了每个状态–动作组合的相应值。然而,在更有趣或更复杂的设置中(如CartPole环境),状态数量过多,无法通过穷尽的方式写出Q,因此,Q通常被理解为一个函数。
  这就是神经网络发挥作用的地方。在现实的设置和环境中,函数Q的封闭形式可能不存在,或者利用动态规划方法很难推导。因此Q学习算法通常仅以近似值为目标。神经网络具有通用逼近能力,是完成Q函数逼近的自然选择。
  Q学习的另一个关键要素是重放。DQL智能体会重放许多经验(状态–动作组合)以定期更新策略函数Q,这可以大大提高学习效果。此外,下面介绍的DQL智能体(DQLAgent) 于学习过程中在探索和利用之间交替。交替会以系统的方式进行,因为智能体仅从探索 开始(一开始它不可能学到任何东西),然后会缓慢但稳定地降低探索率 ϵ 直到达到最低水平。 from collections import deque from keras.optimizers import adam_v2, rmsprop_v2   class DQLAgent:     def __init__(self, gamma=0.95, hu=24, opt=adam_v2.Adam, lr=0.001, finish=False):         self.finish = finish         # 初始探索率          self.epsilon = 1.0         # 最小探索率         self.epsilon_min = 0.01         # 探索率的衰减率         self.epsilon_decay = 0.995         # 延迟奖励的折扣因子         self.gamma = gamma         # 重放的批次大小         self.batch_size = 32         self.max_treward = 0         self.averages = list()         # 有限历史的双端队列 deque 集合         self.memory = deque(maxlen=2000)         self.osn = env.observation_space.shape[0]         self.model = self._build_model(hu, opt, lr)              def _build_model(self, hu, opt, lr):         model = Sequential()         model.add(Dense(hu, input_dim=self.osn,                         activation="relu"))         model.add(Dense(hu, activation="relu"))         model.add(Dense(env.action_space.n, activation="linear"))         model.compile(loss="mse", optimizer=opt(learning_rate=lr))         return model              def act(self, state):         if random.random() <= self.epsilon:             return env.action_space.sample()         action = self.model.predict(state)[0]         return np.argmax(action)          def replay(self):         # 随机选择历史批次进行回放。         batch = random.sample(self.memory, self.batch_size)         for state, action, reward, next_state, done in batch:             if not done:                 reward += self.gamma * np.amax(                     self.model.predict(next_state)[0]) # 状态–动作对的Q值             target = self.model.predict(state)             target[0, action] = reward             # 为新的动作–价值对更新神经网络             self.model.fit(state, target, epochs=1,                            verbose=False)         if self.epsilon > self.epsilon_min:             # 更新探索率             self.epsilon *= self.epsilon_decay          def learn(self, episodes):         trewards = []         for e in range(1, episodes + 1):             state, _ = env.reset()             state = np.reshape(state, [1, self.osn])             for _ in range(5000):                 action = self.act(state)                 # next_state, reward, done, info = env.step(action)                 next_state, reward, done, truncated, info = env.step(action)                 next_state = np.reshape(next_state,                                         [1, self.osn])                 # 存储新数据                 self.memory.append([state, action, reward,                                      next_state, done])                 state = next_state                 if done:                     treward = _ + 1                     trewards.append(treward)                     av = sum(trewards[-25:]) / 25                     self.averages.append(av)                     self.max_treward = max(self.max_treward, treward)                     templ = "episode: {:4d}/{} | treward: {:4d} | "                     templ += "av: {:6.1f} | max: {:4d}"                     print(templ.format(e, episodes, treward, av,                                        self.max_treward), end="r")                     break             if av > 195 and self.finish:                 print()                 break             if len(self.memory) > self.batch_size:                 # 根据过去的经验重放以更新策略                 self.replay()      def test(self, episodes):         trewards = []         for e in range(1, episodes + 1):             state = env.reset()             for _ in range(5001):                 state = np.reshape(state, [1, self.osn])                 action = np.argmax(self.model.predict(state)[0])                 next_state, reward, done, truncated, info = env.step(action)                 state = next_state                 if done:                     treward = _ + 1                     trewards.append(treward)                     print("episode: {:4d}/{} | treward: {:4d}"                           .format(e, episodes, treward), end="r")                     break         return trewards
  DQL智能体如何执行?如以下代码所示,它达到了CartPole的获胜状态,总奖励为200。 图2显示了分数的移动平均线以及它是如何随时间增加的,尽管不是单调增加。相反, 智能体的性能有时会显著下降。除此之外,一直在进行的探索会导致随机操作,这不一定会导致总奖励方面的良好结果,但可能会为更新策略网络带来有益的经验。 episodes = 1000 set_seeds(100) agent = DQLAgent(finish=True) agent.learn(episodes) # Out: # episode:  510/1000 | treward:  224 | av:  199.4 | max:  740  plt.figure(figsize=(10, 6)) x = range(len(agent.averages)) y = np.polyval(np.polyfit(x, agent.averages, deg=3), x) plt.plot(agent.averages, label="moving average") plt.plot(x, y, "r--", label="trend") plt.xlabel("episodes") plt.ylabel("total reward") plt.legend();
  图2 CartPole的DQLAgent平均总奖励
  DQL智能体是否解决了CartPole问题?在现有的游戏设置下,考虑到OpenAI Gym对成功的定义,确实解决了。 trewards = agent.test(100) # Out: # episode:  100/100 | treward:  468  sum(trewards) / len(trewards) # Out: # 532.79简单的金融沙箱
  为了将Q学习方法迁移至金融领域,下面展示了一个模拟OpenAI Gym环境的类,但其仅适用于以金融时间序列数据为代表的金融市场。这里的思路是,类似于CartPole环境,4个历史价格代表金融市场的状态,当给定一个状态时,智能体可以决定是做多还是做空。 在这种情况下,两个环境是可比较的,因为每一个状态都是由4个参数给出,并且智能体可以采取两种不同的动作。
  为了模仿 OpenAI Gym API,需要两个辅助类,一个用于观察空间,一个用于动作空间。 class observation_space:     def __init__(self, n):         self.shape = (n,)          class action_space:     def __init__(self, n):         self.n = n     def seed(self, seed):         pass     def sample(self):         return random.randint(0, self.n - 1)
  以下代码定义了Finance类,该类提取了许多交易品种的日终历史价格。该类的主要方法是 .reset() 和 .step(),其中,.step()方法会检查是否采取了正确的动作,相应地定义奖励,并检查成功或失败。当智能体能够通过整个数据集正确交易时,就取得了成功。当然,这可以有不同的定义(例如,定义当智能体成功交易1000步时就取得了成功)。失败被定义为准确率小于 50%(总奖励除以总步数)。然而,这仅在一定数量的步骤之后进行检查,以避免该指标的初始方差过高。 class Finance:     url = "http://hilpisch.com/aiif_eikon_eod_data.csv"     def __init__(self, symbol, features):         self.symbol = symbol         self.features = features         self.observation_space = observation_space(4)         self.osn = self.observation_space.shape[0]         self.action_space = action_space(2)                  # 定义所需的最低准确率         self.min_accuracy = 0.475         self._get_data()         self._prepare_data()      def _get_data(self):         self.raw = pd.read_csv(self.url, index_col=0,                                parse_dates=True).dropna()     def _prepare_data(self):         self.data = pd.DataFrame(self.raw[self.symbol])         self.data["r"] = np.log(self.data / self.data.shift(1))         self.data.dropna(inplace=True)         self.data = (self.data - self.data.mean()) / self.data.std()         self.data["d"] = np.where(self.data["r"] > 0, 1, 0)      def _get_state(self):         # 选择用于定义金融市场状态的数据         return self.data[self.features].iloc[self.bar - self.osn:self.bar].values      def seed(self, seed=None):         pass      # 将环境重置为其初始值     def reset(self):         self.treward = 0         self.accuracy = 0         self.bar = self.osn         state = self.data[self.features].iloc[             self.bar - self.osn:self.bar]         return state.values      def step(self, action):         # 检查智能体是否选择了正确的动作(成功交易)         correct = action == self.data["d"].iloc[self.bar]         # 定义智能体收到的奖励         reward = 1 if correct else 0         # 将奖励添加到总奖励中         self.treward += reward         # 使环境向前运行一步         self.bar += 1         # 计算给定所有步骤(交易)的成功的动作(交易)的准确率         self.accuracy = self.treward / (self.bar - self.osn)         # 如果智能体到达数据集的末尾,则成功         if self.bar >= len(self.data):             done = True         elif reward == 1:             # 如果智能体采取了正确的动作,那么它可以继续前进             done = False         elif (self.accuracy < self.min_accuracy and self.bar > self.osn + 10):             # 如果在一些初始步骤之后,准确率下降到最低水平以下,则该回合结束(失败)             done = True         else:             # 对于其余情况,智能体可以继续前进             done = False         state = self._get_state()         info = {}         return state, reward, done, info
  Finance 类的实例表现得很像OpenAI Gym的环境。特别是,在这种基本情况下,该实例表现得与 CartPole 环境完全一样。 # 指定用于定义代表状态数据的交易标的代号和特征类型(交易标的代号或对数收益率) env = Finance("EUR=", "EUR=") env.reset() # Out: # array([1.819 , 1.8579, 1.7749, 1.8579])  a = env.action_space.sample() a # Out: # 0   env.step(a) # Out: # (array([1.8579, 1.7749, 1.8579, 1.947 ]), 0, False, {})
  虽然为CartPole游戏开发的DQLAgent能学习在金融市场中进行的交易,但结果并不"惊艳"(参见图3)。 set_seeds(100) agent = DQLAgent(gamma=0.5, opt=rmsprop_v2.RMSprop)  episodes = 1000 agent.learn(episodes) # Out: # episode: 1000/1000 | treward: 2511 | av: 1821.2 | max: 2511  agent.test(3) # Out: # episode:    3/3 | treward: 2511 # [2511, 2511, 2511]  plt.figure(figsize=(10, 6)) x = range(len(agent.averages)) y = np.polyval(np.polyfit(x, agent.averages, deg=3), x) plt.plot(agent.averages, label="moving average") plt.plot(x, y, "r--", label="regression") plt.xlabel("episodes") plt.ylabel("total reward") plt.legend();
  图3 运行于Finance环境的DQLAgent的平均总奖励
  ​
  通过模拟OpenAI Gym环境的API,我们将DQL智能体应用于金融市场环境,无须对智能体本身进行任何更改。尽管智能体在这种新环境中的表现可能并不优异,但它说明了强化学习方法是相当通用的。

王力宏的唱功与地位在华语乐坛处于什么档次?抛开他的其他各种负面新闻的话,王力宏在音乐方面的才华和地位都属于华语乐坛的顶尖!巅峰时期是唯一一个可以拿来和周杰伦比较的歌手,而且00年以后华语乐坛有个排名,周王陶林,王力宏排在周娱乐圈明星艺人接二连三的人设崩塌,是不是应该引起一些反思?国家该出手了,严打娱乐圈,整顿娱乐圈,没有人性的娱乐圈,从郑爽吴亦凡赵丽颖赵薇王力宏这些公众人物给国家造成了多大的影响,这都是资本家贯穿造成的腐败性,如果给他们工资安排就不会疯狂的表弟平时感觉比较笨,但在游戏上有点天赋,这能否说明他智力正常?我来发表一下我的见解吧。感觉楼主没说清楚,是反应慢?学习不好?还是对事物处理的方法方式,一个笨字我们真的无法重点的解释到底怎么回事首先你弟弟的反应,逻辑能力,和智商肯定没问题,能到女孩子成为女人后的心理感受是怎样的?闺蜜最近谈恋爱了,她之前可是母胎单身,在24岁之前都是自己一个人,没有谈过恋爱。但是最近谈了恋爱都好像变了一个人一样,反正约她出来要预约,见一面很难啊。很多人说,女生在谈了恋爱之后欧美女人生完孩子不用坐月子,是什么原因呢?坐月子是一种风俗文化。十里一风,百里一俗,欧美的风俗不同于中国肯定很正常啊。有些人对欧美人不坐月子表示诧异,那是因为觉得自己的坐月子是科学。其实恰好相反,坐月子是一种陋习,是一种迷如果只让你喜欢2个娱乐明星,一男一女,你会选谁?肖战一个践行做好事不留名,匿名捐款的流量明星,一个接受正常高等教育从素人中杀出重围的黑马,他以谦逊温和的面貌示人,骨子却是刚强坚韧。他缜密的逻辑,有内涵深度的访谈,善于独立思考又知李靓蕾为什么选择在离婚后曝光王力宏的不良行径?因为王力宏做的太过分了,转移财产,让舆论针对她老婆。她老婆也是高职女性,为了他放弃自己的事业,做了家庭主妇,还生了三个孩子。可王想让她净身出户,太没有道德底线了。李靓蕾是一位高知女DNF剑魂带什么耳环比较好,黑白混沌怎么样?现有的史诗耳环有这几个缘定三生,这个是吃暴击的,一般来说剑魂的暴击率还是挺高的,出了这个也可以带一带黑白的话这个攻击力加成15,15的独立对瞎子提升更大,所以在有其他耳环的情况下不谁知道为什么现在电视越来越难卖吗?我家里电视很久没打开来看了?我家的电视就是为了春节看春晚,一下子充了两年的闭路电视费。就看了一场春晚,再也没有打开过。偶尔有客人带孩子来我家,孩子们也不看电视了,小孩子们也抱着大人们的手机,玩游戏,看动画片。脸上长痘痘怎么办?謝大圣邀。网上若干回答可鉴可圈可点,不必累赘。只说一句,豆蔻年华脸上长痘痘很自然,不必大惊小怪大费周折,切记重科学遵医嘱。也许找个爱你还能治痘痘的朋友订终身岂不更好?!如果脸上出现为什么感觉重庆中央公园的房价比渝中区还贵?第一,中央公园决不是无人区。第二,中央公园至少现在是主城区唯一的亮点。第三,中央公园是全新的规划布局,有全方面的远景规划,宏伟的新城还在建设中,潜力巨大,所以贵。第四,中央公园是世
外媒发布2022全球最佳品牌榜三星全球登顶据C114消息,近日,市场调研机构舆观调查网(YouGov)发布了2022年全球最佳品牌榜单。全球榜Top10依次为三星电子谷歌YouTubeNetflix(网飞)Shopee(东数据处理能力与组织架构并重,数字化转型考验企业内功作者Sunny责编黎卡斯数字化转型为车企赋能的同时,企业在技术与管理上也需由内到外优化调整。合集选题中国制变面对中国制造与中国智造的宏大命题,胖鲸试图找寻一个微小切角挖掘呈现供应链手握六个第一,电动车科技独角兽绿源下半年来势汹汹今年以来,全球经济面临诸多挑战,让不少行业承压前行,两轮电动车行业亦不例外,但以技术派著称的浙江老牌电动车企绿源却一路逆势而上。年内,绿源不仅在液冷电机的产品升级技术迭代方面捷报频亿级慈善家创历史新高2022年胡润慈善榜发布慈善公益报(景亦兴)11月16日,胡润研究院发布2022胡润慈善榜。刘强东王兴雷军丁世忠家族侯昌财曾毓群陈谭庆芬家族秦英林钱瑛夫妇何享健家族林斌位列前十亿级慈善家达到49人,其中4江铃新能源副总单丰武学历之谜20岁就大学毕业?运营商财经网郝紫艳文本次运营商财经就将目光放在江铃新能源副总经理单丰武身上,为大家揭秘他的过往经历。据公开资料显示,单丰武出生于1975年,至今不过47岁。他自身专业素养不低,曾毕我国新能源汽车多项指标创历史新高央视网消息(新闻联播)今年前十个月,我国新能源汽车产销量出口量等多项指标创历史新高。中国汽车工业协会数据显示,今年1到10月份,我国新能源汽车产销分别完成548。5万辆和528万辆错失电自入场时机,起大早赶晚集,五羊本田欲凭差异化翻身?生意还可以,近日,南都奥一新闻记者走进广州越秀区一家五羊本田电动自行车门店,中年店主一边组装新车一边告诉记者。店外,一位女士正推着新买的电动车准备离开,她笑着说推荐5000多那款车销冠融资IPO哪吒的向上之路该怎么走?国内造车新势力之间的角逐绝对是一场大戏,这种内卷在某种意义上也凸显了中国新能源行业的活力,层出不穷的品牌更是印证了各方对新能源汽车的关注,从最开始的百花齐放到蔚小理领衔再到哪吒零跑连续12天热度第一,2022年底,这部剧打开了古装甜宠剧的天花板高开,疯走。说的就是这部剧卿卿日常临近年末,各类剧仿佛也开始扎堆凑起了KPI,口碑一向平淡的古装甜宠剧,终于在一众新剧中脱颖而出,雄起了一把。这部卿卿日常,自上线后一路火爆,过关斩短视频平台风向转,快手能否靠电商打开出路?平台的变现模式一般是广告收入,Meta(META。US)作为社交平台的广告风向标,其2022年9月财季并不理想的广告收入表现预示了全球经济放缓对广告主支出的限制。Meta的2022今日财经头条市场监管总局经营者不得利用数据算法及平台规则等从事不正当竞争行为11月22日,国家能源局发布的最新数据显示,截至10月底,全国累计发电装机容量约25。0亿千瓦,同比增长8。3。其中,风电装机容量约3。5亿千瓦,同比增长16。6太阳能发电装机容量